繁体   English   中英

针对不同实例调用不同功能的设计模式

[英]Design pattern for calling different functions for different instances

我有这样的Java代码-

Sample obj;
if(obj instanceOf Class1) 
{
    method1(obj);
} else if(obj instanceOf Class2) 
{
    method2(obj);
} else if(obj instanceOf Class3) 
{
    method3(obj);
}

Class1Class2Class3实际上是DTO,它们是Sample的子代,因此我不想在DTO中编写业务逻辑。

我想在不同的类中编写method1mehtod2method3的逻辑。 有没有设计模式。 我正在使用Spring MVC。

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

定义method接口并在Class1Class2Class3实现公共接口-在那些类的实现中适当地委托给method1method2method3 编程到通用界面。

obj.method();

不好,但让我们尝试

  • 创建一个界面

    公共接口处理器{

     void process(Simple simple); 

    }

  • 为示例的每个子类编写实现// // Class1 Processor公共类Class1Processor实现Processor {

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

    } // Class2 Processor公共类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()); } 

    }

  • 最后是Main类public static void main(String [] args){

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

    }

如何为类创建自定义注释? 这会解决您有关业务逻辑等的问题吗?

@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) { ... }
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM