具有实现特定参数类型的模板方法模式

时间:2011-07-16 05:53:12

标签: java design-patterns template-method-pattern

当我想使用模板方法模式时,我经常遇到这种情况,但模板方法需要不同类型的参数,如下所示:

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。同样的问题也适用于战略模式。

3 个答案:

答案 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);
}