[英]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);
}
Class1 , Class2和Class3实际上是DTO,它们是Sample的子代,因此我不想在DTO中编写业务逻辑。
我想在不同的类中编写method1 , mehtod2和method3的逻辑。 有没有设计模式。 我正在使用Spring MVC。
基本上,我正在寻找一些非Java技术来基于实例调用适当的方法,而不是每次都与instanceOf进行检查。
定义method
接口并在Class1
, Class2
和Class3
实现公共接口-在那些类的实现中适当地委托给method1
, method2
或method3
。 编程到通用界面。
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.