2

同様のシナリオで Stackoverflow に関するいくつかの質問が既にありますが、実際には私のケースには対応していません。私は現在、いくつかのリファクタリングを行っており、パターンを適用することで、コードをより堅牢で柔軟で読みやすくしたいと考えています。タスクは次のとおりです。

クラス A としましょう。これは、メンバーの 1 つを設定するときにいくつかのロジックを適用します。このロジックは変わりやすいので、外部化したいと思います。これは、戦略パターンが役立つ場所です。また、ある段階で、クラス A のオブジェクトのリストをフィルター処理する必要があります。フィルター ロジックも構成可能である必要があるため、このタスクでも戦略パターンが役立ちます。問題は、これらの要件をオブジェクト指向設計に組み込むにはどうすればよいかということです。

これまでの私の考え: - SettingMemberStrategy と FilterStrategy の 2 つの戦略オブジェクトを持つ、タイプ A のオブジェクトのファクトリを使用します。具体的なファクトリがシングルトンとして実装されている場合、オブジェクトを作成する前に 2 つの戦略オブジェクトを指定する必要があります。- クラス A のインターフェイスに次の 2 つのメソッドがあります: setMember(value); ブール値のfiltered()。これらのメソッドの正確な実装は、戦略によって決定されます。しかし、オブジェクトは戦略のインスタンスも保持する必要がありますか?

このアプローチは機能する可能性がありますが、タスクに対して少し過剰に設計されており、見た目も美しくありません。誰かがより良い解決策を示唆できますか? どうもありがとう。

乾杯、

マーティン

public interface IA {
   setMember(); 
   filter();
}

public class A implements IA {
   private String theMember = "";

   getMember() { return this.theMember; }
   setMember(String input, otherParameters[]) {  
      // set value for member based on strategy and parameters
   }        

   boolean filter(); 
   // returns yes/no based on whether this class should be filtered 
   // as per filter strategy
}


public class myFactory {
    private FilterStrategy  myFilterStrategy; 
    private MemberStrategy  mySetMemberStrategy; 

    IA createObjectOfClassA() {
        a = new A(mySetMemberStrategy, myFilterStrategy);
    }

    setFilterStrategy(FilterStrategy s) { this.myFilterStrategy = s }

    setMemberStrategy(MemberStrategy s) { this.mySetMemberStrategy = s }
}
4

1 に答える 1

1

この質問は、これらのオブジェクトをどのように使用するかに完全に依存します。私の本能によると、ほとんどの場合、ファクトリ パターンと戦略パターンの両方は必要ありません。どちらか一方を選択して、コードを単純化する必要があります。

たとえば、ファクトリでオブジェクト A のサブクラスを作成している場合は、構成可能な戦略を削除して、サブクラスに焼き付けます。

ただし、サブクラスを作成しない場合は、構成可能な戦略を持つオブジェクトだけを用意し、ファクトリを削除して、必要なときにコンストラクターで適切な戦略を持つオブジェクトを作成します。

たとえば、入力に基づいてオブジェクトを作成し、ファクトリメソッドを使用して適切なインスタンスを提供する場合、2つの組み合わせを使用することもできます。

public A MyFactoryMethod(string typeToCreate){
      switch(typeToCreate) {
           case "AbeforeB":
               return new A(new FilterStrategyA(), new MemberStragegyB());
           case "allA":
               return new A(new FilterA(), new MemberStrategyA());  
           // etc. etc.        
       }
}
于 2013-05-07T15:02:13.707 に答える