繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM