用于为不同实例调用不同函数的设计模式

时间:2018-04-29 22:08:17

标签: 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,他们是 Sample 的孩子,所以我不喜欢我想在DTO中编写业务逻辑。

我想在另一个类中编写 method1 mehtod2 method3 的逻辑。是否有设计模式。 我正在使用spring MVC。

基本上,我正在寻找一些基于实例调用适当的非java技术,而不是每次都使用instanceOf进行检查。

3 个答案:

答案 0 :(得分:2)

定义method接口并在Class1Class2Class3中实施通用接口 - 委托给method1method2或{ {1}}适当地在这些类的实现中。编程到通用接口。

method3

答案 1 :(得分:2)

不是很好,但试试吧

  • 创建界面

    public interface Processor {

    void process(Simple simple);
    

    }

  • 为Sample的每个子类编写实现 // Class1处理器 公共类Class1Processor实现Processor {

    @Override
    public void process(Simple simple) {
        System.out.println("Class1 processing completed");
    }
    

    } // Class2处理器 公共类Class2Processor实现Processor {

    @Override
    public void process(Simple simple) {
        System.out.println("Class2 processing completed");
    }
    

    }

  • 处理器工厂类 公共类ProcessorFactory {

    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());
    }
    

    }

  • 最后是主要课程 public static void main(String [] args){

    Simple class1 = new Class1();
    Simple class2 = new Class2();
    
    ProcessorFactory.getProcessor(class1).process(class1);
    ProcessorFactory.getProcessor(class2).process(class2);
    

    }

答案 2 :(得分:1)

如何为类创建自定义注释?这是否解决了有关业务逻辑等的问题 像

这样的东西
@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) { ... }
     }
}