次のコード サンプルは、Wikipedia からコピーした Strategy パターンの実装です。私の完全な質問はそれに続きます...
ウィキのmain
方法:
//StrategyExample test application
class StrategyExample {
public static void main(String[] args) {
Context context;
// Three contexts following different strategies
context = new Context(new ConcreteStrategyAdd());
int resultA = context.executeStrategy(3,4);
context = new Context(new ConcreteStrategySubtract());
int resultB = context.executeStrategy(3,4);
context = new Context(new ConcreteStrategyMultiply());
int resultC = context.executeStrategy(3,4);
}
}
パターンピース:
// The classes that implement a concrete strategy should implement this
// The context class uses this to call the concrete strategy
interface Strategy {
int execute(int a, int b);
}
// Implements the algorithm using the strategy interface
class ConcreteStrategyAdd implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyA's execute()");
return a + b; // Do an addition with a and b
}
}
class ConcreteStrategySubtract implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyB's execute()");
return a - b; // Do a subtraction with a and b
}
}
class ConcreteStrategyMultiply implements Strategy {
public int execute(int a, int b) {
System.out.println("Called ConcreteStrategyC's execute()");
return a * b; // Do a multiplication with a and b
}
}
// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context {
private Strategy strategy;
// Constructor
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}
上記の例を具体的に考えると、Context
クラスは冗長ですか?
main
たとえば、 Context を除く既存のクラスとインターフェイスを使用して、次の代替実装を考え出すことができます。これはまったく同じように機能します。まだ疎結合です。
((編集:この単純なシナリオで、Context クラスを省略した場合、将来間違いを犯すことになりますか? ))
public static void main(String[] args) {
IStrategy strategy;
// Three strategies
strategy = new ConcreteStrategyAdd();
int resultA = strategy.executeStrategy(3,4);
strategy = new ConcreteStrategySubtract();
int resultB = strategy.executeStrategy(3,4);
strategy = new ConcreteStrategyMultiply();
int resultC = strategy.executeStrategy(3,4);
}
まとめの更新
回答とコメントを通じて発見されたものをポイント形式でリストします。
- Context は、合成された Strategy の使用方法 (呼び出しのタイミングなど) のバリエーションを可能にします。異なるコンテキストは、特定の戦略を呼び出す前と後に異なる内部作業を行う場合があります。
- コンテキストは高レベルの「ブラック ボックス」です。クライアントはコンテキストの呼び出し方法しか理解できないため、クライアントを壊すことなく、コンテキスト ロジックを変更したり、合成された戦略を変更したり (または別のものを使用したり) することができます。
- Context を省略してウィキペディアのサンプル コードの別の実装を作成しましたが、元のコードと同じように機能しましたが、状況全体が単純化され (どちらの場合も)、私の変更は実際には次のことを意味していました: 1. 戦略ではない2.ここで言及されている戦略パターンの精神の利点が恋しいです。
- 私の別の実装では、Context のようなメイン メソッドを使用していたので、効果的にシミュレートする場合は、Context を保持した方がよいでしょう。不純な戦略パターンを作成することで、混乱が生じました。一からやり直す必要も、より賢くしようとする必要もありませんでした (この場合)。
他のポイントが役立つ場合、またはこれを修正する必要がある場合は、コメントを残してください。それに応じてリストを変更します.