4

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

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

这看起来不太好。提供的参数之一必须为空,并且所有服务都必须为其他类型实现虚拟 doProcess 方法。有没有更好的模式呢?你怎么处理这个?我不想使用构造函数,因为这些服务是 spring bean。同样的问题也适用于策略模式。

4

3 回答 3

4
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();
    }
}
于 2011-07-16T06:21:39.223 回答
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 都有表达它们依赖关系的构造函数。那有什么问题?

于 2011-07-16T06:21:26.213 回答
2

我认为使用 Wrapper 类可以解决这个问题。Wrapper 类可以是一个简单的 Holder 实体。您甚至可以考虑将您的应用程序特定属性封装在包装类中(更多关于上下文的行)。使用这种方法,您只需要一个处理方法,并且子类只会处理具有正确类型的消息。为避免代码重复,您还可以在抽象类中进行检查。请参阅以下示例,

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);
}
于 2011-07-16T06:51:07.917 回答