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

我有这样的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编写业务逻辑

我想在另一个类中编写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配置