序文
ソフトウェア開発では、特定の機能を実現するための複数の戦略やアルゴリズムがあり、実際の状況に応じてさまざまなアルゴリズムや戦略を選択できることがよくあります。これらのアルゴリズムまたは戦略が抽象化されている場合、統一されたインターフェイスが提供されます。アルゴリズムや戦略が異なれば、実装クラスも異なります。アルゴリズムまたは戦略の動的な置き換えは、さまざまな実装オブジェクトを挿入することで実現できます。これが戦略モードです。
定義
戦略パターンは、一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、それらを交換可能にします。ストラテジーモードでは、アルゴリズムを使用する顧客とは関係なくアルゴリズムを変更できます
UML
使用するシーン
- 同じタイプの問題に対処する方法は複数ありますが、特定の動作のみが異なります
- 同じタイプの複数の操作を安全にカプセル化する必要がある場合
- 同じ抽象クラスのサブクラスが複数あり、if-elseまたはswitch-caseを使用して特定のサブクラスを選択する必要がある場合
練習
都市の公共交通機関のコストの例を見てみましょう。一般的に、セグメントの価格設定が実装されています。距離が遠いほど、価格は高くなります。
// 定义一个抽象的价格计算接口
public interface CalculateStrategy{
int calculatePrice(int km)
}
// 公交车的计算策略类
public class BusStrategy implements CalculateStrategy{
@override
public int calculatePrice(int km){
return 1 // 这里简单起见,实际按照公交车乘车规则计费
}
}
// 地铁的计算策略类
public class SubwayStrategy implements CalculateStrategy{
@override
public int calculatePrice(int km){
return 2 // 这里简单起见,实际按照地铁乘车规则计费
}
}
// 出行价格计算器
public class TranficCalculator{
CalculateStrategy mStrategy;
public void setStrategy(CalculateStrategy mStrategy){
this.mStrategy=mStrategy
}
public int calculatePrice(int km){
return mStrategy.calculatePrice(km);
}
}
public static void main(String [] args){
TranficCalculator calculator=new TranficCalculator ();
// 公交车费用
calculator.setStrategy(new BusStrategy());
// 地铁费用
calculator.setStrategy(new SubwayStrategy());
}
概要
ストラテジーモードは主にアルゴリズムを分離するために使用され、同じ動作の抽象化の下で異なる特定の実装ストラテジーがあります。このモードは、オープンとクローズの原則、つまり、抽象化を定義し、さまざまな実装を注入して優れたスケーラビリティを実現するための優れたデモンストレーションです。
利点
- 戦略モードは、関連するアルゴリズムファミリを管理する方法を提供し、アルゴリズムを切り替えることができます
- 複数の条件分岐ステートメントの使用は避けてください
不利益
- クライアントはすべての戦略クラスを知っており、使用する戦略クラスを決定します。戦略クラスは完全に公開されています
- 戦略クラスがたくさんあることもあります