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

これはよく見えません。提供されるパラメーターの1つはヌルである必要があり、すべてのサービスは他のタイプのダミーのdoProcessメソッドを実装する必要があります。これに適したパターンはありますか?これにどのように対処しますか?これらのサービスはSpringBeanであるため、コンストラクターは使用しません。同じ問題がストラテジーパターンにも当てはまります。

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クラスを使用すると、この問題を解決できると思います。ラッパークラスは、単純なホルダーエンティティにすることができます。アプリケーション固有のプロパティをラッパークラスにカプセル化することを検討することもできます(コンテキストの行について詳しく説明します)。このアプローチでは、必要なプロセスメソッドは1つだけであり、サブクラスはメッセージが正しいタイプである場合にのみメッセージを処理します。コードの重複を避けるために、抽象クラスでそのチェックを行うこともできます。次の例を参照してください。

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 に答える