当我想使用模板方法模式时,我经常遇到这种情况,但模板方法需要不同类型的参数,如下所示:
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。同样的问题也适用于战略模式。
答案 0 :(得分:3)
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();
}
}
答案 1 :(得分:2)
你是对的,它肯定不是模板方法模式,但我不确定你到底想要做什么。也许你是在工厂模式之后:
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都有表达它们依赖关系的构造函数。这有什么问题?
答案 2 :(得分:2)
我认为使用Wrapper类可以解决这个问题。包装类可以是一个简单的Holder实体。您甚至可以考虑在包装类中封装特定于应用程序的属性(更多内容在Context的行上)。使用这种方法,您只需要一个进程方法,子类只有在具有正确类型的情况下才会处理它。为了避免代码重复,您还可以在抽象类中进行检查。请参见以下示例
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);
}