Java 针对不同实例调用不同函数的设计模式
我有这样的java代码-Java 针对不同实例调用不同函数的设计模式,java,spring,spring-mvc,design-patterns,Java,Spring,Spring Mvc,Design Patterns,我有这样的java代码- Sample obj; if(obj instanceOf Class1) { method1(obj); } else if(obj instanceOf Class2) { method2(obj); } else if(obj instanceOf Class3) { method3(obj); } Class1、Class2和Class3实际上是DTO,它们是示例的子级,所以我不想用DTO编写业务逻辑 我想在另一个类中编写meth
Sample obj;
if(obj instanceOf Class1)
{
method1(obj);
} else if(obj instanceOf Class2)
{
method2(obj);
} else if(obj instanceOf Class3)
{
method3(obj);
}
Class1、Class2和Class3实际上是DTO,它们是示例的子级,所以我不想用DTO编写业务逻辑 我想在另一个类中编写method1、Method2和method3的逻辑。有没有这样的设计模式。 我正在使用SpringMVC
基本上,我正在寻找一些非java技术来根据实例调用适当的函数,而不是每次都检查实例。定义一个
方法接口,并在Class1
、Class2
和Class3
中实现公共接口-委托给方法1
,method2
或method3
在这些类的实现中视情况而定。编程到公共接口
obj.method();
为类创建自定义注释怎么样?这是否解决了您在业务逻辑等方面的问题。
差不多
@CustomMethodName(method="method1")
public class Class1{
//..
}
@CustomMethodName(method="method2")
public class Class2{
//..
}
@CustomMethodName(method="method3")
public class Class3{
//..
}
之后,您应该使用
Class<?> aClass = Sample.class;
Annotation[] annotations = aClass.getAnnotations();
for(Annotation annotation : annotations){
if(annotation instanceof CustomMethodName){
CustomMethodName myAnnotation = (CustomMethodName) annotation;
String methodName = myAnnotation.method();
java.lang.reflect.Method method;
try {
method = obj.getClass().getMethod(methodName);// get method wherever you define them
method.invoke(obj);//execute method
} catch (SecurityException e) { ... }
catch (NoSuchMethodException e) { ... }
}
}
Class aClass=Sample.Class;
Annotation[]annotations=aClass.getAnnotations();
用于(注释:注释){
if(CustomMethodName的注释实例){
CustomMethodName myAnnotation=(CustomMethodName)注释;
String methodName=myAnnotation.method();
java.lang.reflect.Method;
试一试{
method=obj.getClass().getMethod(methodName);//无论在何处定义方法,都可以获取方法
调用(obj);//执行方法
}catch(SecurityException e){…}
catch(NoSuchMethodException){…}
}
}
不是个好主意,但让我们试试看
- 创建一个接口
公共接口处理器{
void process(Simple simple);
@Override
public void process(Simple simple) {
System.out.println("Class1 processing completed");
}
@Override
public void process(Simple simple) {
System.out.println("Class2 processing completed");
}
}
- 为示例的每个子类编写实现
//一级处理机
公共类处理器实现处理器{
void process(Simple simple);
@Override
public void process(Simple simple) {
System.out.println("Class1 processing completed");
}
@Override
public void process(Simple simple) {
System.out.println("Class2 processing completed");
}
}
//2类处理器
公共类Class2Processor实现处理器{
void process(Simple simple);
@Override
public void process(Simple simple) {
System.out.println("Class1 processing completed");
}
@Override
public void process(Simple simple) {
System.out.println("Class2 processing completed");
}
}
- 处理器工厂级
公共类处理器工厂{
private static final Map<Class<? extends Simple>, Processor> LOOKUP = new HashMap<>();
static {
LOOKUP.put(Class1.class, new Class1Processor());
LOOKUP.put(Class2.class, new Class2Processor());
}
public static <T extends Simple> Processor getProcessor(T obj) {
return LOOKUP.get(obj.getClass());
}
}
Class1、Class2和Class3实际上是DTO,它们是示例的子级,所以我不想在DTO中编写业务登录。我也会更新这个问题。谁在呼叫methodn(…)
?它们是在某个共享服务中,还是全部都在Sample
中?@J-Alex:目前,这些只是当前类中的私有方法。但是我想有组织地把他们转移到不同的班级。现在的班级是什么?是春季服务还是什么?@J-Alex:是的。它是一个spring服务,因为Java不支持双重分派,所以访问者模式通常被作为一种替代方案提出,例如,确切地说。我在寻找类似的东西。我只想让它有更少的Java和更多的SpringXML配置