[英]Template method pattern with implementation specific parameter type
当我想使用模板方法模式时,我经常遇到这种情况,但是模板方法需要不同类型的参数,如下所示:
public abstract class AbstractFoo {
public void process(TypeA a, TypeB b) {
//do common processing
if (b == null) {
doProcess(a);
} else if(a == null) {
doProcess(b);
}
}
public abstract void doProcess(TypeA a);
public abstract void doProcess(TypeB b);
}
这看起来不太好。 提供的参数之一必须是 null 并且所有服务都必须为其他类型实现虚拟 doProcess 方法。 有没有更好的模式呢? 你如何处理这个问题? 我不想使用构造函数,因为这些服务是 spring bean。 同样的问题也适用于策略模式。
public abstract class AbstractFoo<T> {
public void process(T a) {
//do common processing
doProcess(a);
}
protected abstract void doProcess(T a);
}
public class Person extends AbstractFoo<Person> {
@Override
protected void doProcess(Person p) {
p.draw();
}
}
public class Car extends AbstractFoo<Car> {
@Override
protected void doProcess(Car c) {
c.draw();
}
}
你是对的,它绝对不是模板方法模式,但我不确定你到底想要做什么。 也许你在工厂模式之后:
interface Foo {
boolean isA();
boolean isB();
...
}
class ProcessorFactory {
public Processor getProcessor(Foo foo) {
if (foo.isA()) {
return new AProcessor();
}
if (foo.isB()) {
return new BProcessor();
}
...
}
}
至于构造函数,我所有的 spring bean 都有表达它们依赖关系的构造函数。 那有什么问题?
我认为使用 Wrapper class 可以解决这个问题。 Wrapper class 可以是一个简单的 Holder 实体。 您甚至可以考虑将您的应用程序特定属性封装在包装器 class 中(更多关于上下文行)。 使用这种方法,您只需要一个处理方法,并且子类只会处理具有正确类型的消息。 为避免代码重复,您还可以检查抽象 class。 请参阅以下示例,
public class Context {
private Object body;
public Context(Object obj) {
body = obj;
}
public Object getBody() {
return body;
}
}
public abstract class AbstractFoo {
public void process(Context ctx) {
//do common processing
if (canProcess(ctx)) {
doProcess(ctx.getBody());
}
}
protected abstract <T extends Object> boolean canProcess(T obj);
protected abstract <T extends Object> void doProcess(T obj);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.