戦略パターンを正しく使用することは、コンテキスト(ケースクラスA
)と戦略(ケースではFunction
)の間の集約を意味します。
以下の画像(Gang of Four書籍のDesign patterns: elements of reusable object-oriented softwareから取得)の関係を見ることができます。私はあなたの問題への従来のStrategyパターンのアプローチを適用した以下
。この場合は、Function.apply(AbstractForm)
がList<DataBean>
を返すようにして、キャスティングの必要性を排除しました。もちろん、汎用性を利用してFunction
をより柔軟にすることができます。
戦略この場合
public interface Function {
List<DataBean> apply(AbstractForm form);
}
コンテキスト
public class A {
private Function fetchData; // strategy
public void setStrategy(Function fetchData) { // method for setting the strategy
this.fetchData = fetchData;
}
// precondition: fetchData != null
public Object generateData(AbstractForm form) {
List<DataBean> dataBeans = fetchData.apply(form); // using the strategy
return null; // whatever you want to return
}
}
、拡張クラスA
は、我々の戦略(Function
)setStrategy(Function)
を使用して注入できるよう必要ありませんです。しかし、私たちは常にA
を、あらかじめ定義されたストラテジーを持つオブジェクトに拡張することができます。例えば
:ファクトリメソッド
を使用して
public class B extends A {
public B() {
setStrategy((form) -> null); // implement your concrete strategy here
}
}
データをフェッチするための戦略は、おそらく必要とされ、そこに使用するために何の「デフォルト」ないかもしれないし、今までに変更されないことがありますので、 Factoryメソッドパターンを使用して、Product(Function
)の作成を強制することができます。注釈クラスA
は現在抽象化されており、ファクトリメソッドcreateFunction()
を含み、サブクラス(例:B
)に実装されてFunction
が作成されます。
ファクトリメソッドパターンのデザインは、以下のUMLで見ることができます。この場合、当社の製品は以前は戦略(Function
)であり、作成者はクラスA
であり、ConcreteCreatorはクラスB
です。この場合
クリエーター
public abstract class A {
private Function fetchData; // product to be used
public class A() {
fetchData = createFunction(); // call factory method
}
protected abstract Function createFunction(); // factory method
// precondition: fetchData != null
public Object generateData(AbstractForm form) {
List<DataBean> dataBeans = fetchData.apply(form); // using the product
return null; // whatever you want to return
}
}
ConcreteCreator
public class B extends A {
@Override
protected Function createFunction() {
return (form) -> null; // return product
}
}
製品を固定し、changableないが、これは二つのパターンを混合することによって克服することができ一緒に、最初の例ではクラスA
から再び10になります。
多分それはあなたを助けるかもしれません:Java 8の戦略デザインパターンhttp://www.baeldung.com/java-strategy-pattern –
私たちはあなたがそのアイデアを正しく持っているかどうかをどのように認識するでしょうか?コードの一部を投稿することはできません... – Holger