1定義
戦略パターンは、同じ目的で異なる実装方法を持つアルゴリズムのグループを収集して、それらを相互に置き換えることができるようにすることです。アルゴリズムの変更は、アルゴリズムを使用する顧客に影響を与えません。戦略パターンは、オブジェクトの動作パターンに属し、アルゴリズムをカプセル化し、アルゴリズムを使用する責任をアルゴリズムの実装から分離し、これらのアルゴリズムの管理をさまざまなオブジェクトに委任します。
2つの利点
1.複数の条件ステートメントを維持するのは簡単ではありません。戦略パターンを使用すると、if ... elseステートメント、switch...caseステートメントなどの複数の条件ステートメントの使用を回避できます。
2.戦略パターンは、一連の再利用可能なアルゴリズムファミリを提供します。継承を適切に使用すると、アルゴリズムファミリの共通コードを親クラスに転送できるため、コードの重複を回避できます。
3.ストラテジーモードは、同じ動作のさまざまな実装を提供でき、顧客は、さまざまな時間またはスペースの要件に応じてさまざまな実装を選択できます。
4.ストラテジーモードは、オープンクローズの原則を完全にサポートし、元のコードを変更せずに新しいアルゴリズムを柔軟に追加できます。
5.ストラテジーモードは、アルゴリズムの使用を環境クラスに入れ、アルゴリズムの実装を具体的なストラテジークラスに移動して、2つの分離を実現します。
6.ファクトリパターンと組み合わせたストラテジーパターンは、クライアントクラスとアルゴリズム抽象化の間の結合を減らすことができます。
説明する3つの例
天気に応じて、毎日仕事に行くためのさまざまな戦略があります。晴れ、自転車で通勤、雨、地下鉄で通勤、風が強い、ドライブで通勤、雪、徒歩で通勤。クライアントは、気象条件に応じてさまざまな作業戦略を選択します。
4UMLクラス図
5サンプルコード
5.1WayToWorkStrategyインターフェース
public interface WayToWorkStrategy {
/**
* 如何去上班
* @return 上班方式
*/
String chooseWayToWork();
}
5.2 BicycleWay
public class BicycleWay implements WayToWorkStrategy{
@Override
public String chooseWayToWork() {
return "骑自行车去上班";
}
}
5.3カーウェイカー
public class CarWay implements WayToWorkStrategy{
@Override
public String chooseWayToWork() {
return "开车去上班";
}
}
5.4 SubwayWay
public class SubwayWay implements WayToWorkStrategy{
@Override
public String chooseWayToWork() {
return "坐地铁去上班";
}
}
5.5ウォークウェイ
public class WalkWay implements WayToWorkStrategy{
@Override
public String chooseWayToWork() {
return "走路去上班";
}
}
5.6ContextStrategyストラテジーオブジェクトへの参照
public class ContextStrategy {
private String climate;
WayToWorkStrategy wayToWorkStrategy;
public ContextStrategy(String climate){
this.climate = climate;
this.wayToWorkStrategy = chooseContextStrategy();
}
private WayToWorkStrategy chooseContextStrategy(){
//简单工厂模式
switch (climate) {
case "sun":
return new BicycleWay();
case "rain":
return new SubwayWay();
case "wind":
return new CarWay();
case "snow":
return new WalkWay();
default:
return null;
}
}
/**
* 获取上班策略
* @return 上班策略
*/
public String showWayToWork(){
if (wayToWorkStrategy == null){
return "天气不符合要求,无法上班,好开心";
}
return wayToWorkStrategy.chooseWayToWork();
}
}
5.7MainClassの主な機能
public class MainClass {
public static void main(String[] args) {
boolean flag = true;
while (flag) {
//模拟天气参数
Scanner sc = new Scanner(System.in);
String climate = sc.nextLine();
if (climate.equals("exit")) {
flag = false;
} else {
ContextStrategy strategy = new ContextStrategy(climate);
System.out.println(strategy.showWayToWork());
}
}
}
}
5.8実行結果
6引用
1.「Dahuaデザインパターン」
7ソースコード
https://github.com/airhonor/design-pattern-learning/tree/main/src/com/hz/design/pattern/strategy