我有一个像这样的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进行检查。
答案 0 :(得分:2)
定义method
接口并在Class1
,Class2
和Class3
中实施通用接口 - 委托给method1
,method2
或{ {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) { ... }
}
}