[デザインモード]-戦略モード

1.戦略モードの概要

1.戦略モードとは

戦略パターンは**ポリシーパターン**も呼ばれ、アルゴリズムグループを定義し、それらを個別にカプセル化して、アルゴリズムの変更がアルゴリズムを使用するユーザーに影響を与えないように相互に置き換えることができるようにします。ストラテジーモードはビヘイビアデザインモードです。ストラテジーモードでは、クラスのビヘイビアとアルゴリズムを実行時に変更できます。

2.戦略モードはいつ使用できますか

戦略モードは通常、次のシナリオで適用されます。

  1. if-elseによって引き起こされるコードの複雑さとメンテナンスの問題を排除します
  2. アプリケーションは、複数のクラス間でアルゴリズムと動作がわずかに異なります
  3. シールドアルゴリズムによって実装する必要があるシナリオ
  4. アルゴリズムを自由に切り替えます

2.ビジネスシナリオ分析戦略モード

1.ビジネスシナリオ

理論的な変更によっては、デザインパターンの概念をよく理解できないと思いますが、逆に催眠術をかけやすいので、デザインパターンについて話すときは、実際のビジネスシナリオを使用してアプリケーションについて話すことに慣れています。そしてこのことの実装。今日は、戦略モードの最も一般的な使用シナリオの1つであるプロモーション活動を使用して、戦略モードがどのように適用されるか確認します。

有名な生鮮食品プラットフォームは、100マイナス20元を超える肉製品、50マイナス15を超える野菜製品、100マイナス10元を超える調理済み食品など、年末のプロモーションイベントを新年の近くに開催しました。プロモーションと相互作用について学んだ後、シャオロンは生鮮食品プラットフォームで123元の肉製品、53元の野菜製品、140元の調理済み食品を注文しました。シャオロンが最終的に支払う必要のある金額を計算してください。

2.戦略モードなしのビジネス実現

戦略モデルを採用しない場合、最初は単純なif-elseで商品タイプを区別し、割引額を計算することだと思うかもしれませんそれでは、前の方法でそれを実装する方法を見て、このコードの長所と短所を分析しましょう:

ステップ1:注文インターフェースを作成する

public interface Order {
    
    
// 计算优惠
	Long calculate();
}

ステップ2:肉、野菜、調理済み食品の注文を作成する

public class MeatOrder implements Order{
    
    

	// 订单总金额
	private Long totalAmount;

	// 实际支付金额
	private Long realAmount;

	public Long calculate() {
    
    
		if (totalAmount >= 10_000) {
    
    
			realAmount = totalAmount - 2000;
		} else {
    
    
			realAmount = totalAmount;
		}
		return realAmount;
	}

	public MeatOrder(Long totalAmount) {
    
    
		super();
		this.totalAmount = totalAmount;
	}
}

public class VegetablesOrder implements Order {
    
    

	// 订单总金额
	private Long totalAmount;

	// 实际支付金额
	private Long realAmount;

	public Long calculate() {
    
    
		if (totalAmount >= 5000) {
    
    
			realAmount = totalAmount - 1500;
		} else {
    
    
			realAmount = totalAmount;
		}
		return realAmount;

	}

	public VegetablesOrder(Long totalAmount) {
    
    
		super();
		this.totalAmount = totalAmount;
	}

}
// 熟食订单
public class CookedFoodOrder implements Order {
    
    

	// 订单总金额
	private Long totalAmount;

	// 实际支付金额
	private Long realAmount;

	public Long calculate() {
    
    
		if (totalAmount >= 10_000) {
    
    
			realAmount = totalAmount - 1000;
		} else {
    
    
			realAmount = totalAmount;
		}
		return realAmount;

	}

	public CookedFoodOrder(Long totalAmount) {
    
    
		super();
		this.totalAmount = totalAmount;
	}

}

ステップ3:レジを作成する

public class Cashier {
    
    

	public static void main(String[] args) {
    
    
		MeatOrder meatOrder = new MeatOrder(123 * 100l);
		VegetablesOrder vegetablesOrder = new VegetablesOrder(53 * 100l);
		CookedFoodOrder cookedFoodOrder = new CookedFoodOrder(140 * 100l);
		// 收银
		List<Order> list = new ArrayList<>();
		list.add(meatOrder);
		list.add(vegetablesOrder);
		list.add(cookedFoodOrder);
		Long cashier = cashier(list);
		System.out.println("您一共消费"+(cashier / 100) + "元");

	}

	/**
	 * @Title: cashier
	 * @Description: TODO
	 *
	 */
	private static Long cashier(List<Order> list) {
    
    
		Long amount = 0l;
		for (Order order : list) {
    
    
			Long calculate = order.calculate();
			amount += calculate;
		}
		return amount;
	}
}

このコードの長所と短所を分析してみましょう。
まず、このコードがJava独自のポリモーフィズムの特性を使用して、各注文クラスに独自の完全削減アルゴリズムを実装していることがわかります。この書き方の利点は、多くの学生が想像できるように、実装が簡単なことです。2つ目は、コードの量が少なく、開発ワークロードが大きくないことです。では、この書き方には不利な点はありますか?もちろん!この書き込み方法の動的拡張能力は非常に劣っています。この時点で新しい要件を提案すると、次のようになります。

年末年始後、生鮮食品プラットフォームは元の価格に戻すことを決定しました

それでは、今回何をするのか考えてみますか?
ここに画像の説明を挿入
最も簡単な方法は、上記のコードの完全な削減に関する部分を直接削除することです。しかし、これは間違いなく、JAVA設計仕様の開始と終了の原則に違反しています。ビジネスの変更の場合、私たちは拡張に対してオープンであり、変更に対してクローズである必要があり、直接のコード変更は許可されていません。では、この状況で何をすべきでしょうか?

3.戦略モードの実装

戦略モードは、頻繁に変更されるこの種のビジネスシナリオ向けに設計されています。ここでは、最初に戦略パターンコードの実装を提供し、後でこのコードがどのように設計されているかを分析します。

3.1最初のステップは、ポリシー定義インターフェースを作成することです

public interface FullReduction {
    
    
	Long reduction(Long amount);
}

3.2インターフェースを実装するための戦略を作成する

public class MeatReduction implements FullReduction {
    
    

	@Override
	public Long reduction(Long amount) {
    
    
		if (amount >= 10_000) {
    
    
			return amount - 2000;
		} else {
    
    
			return amount;
		}
	}

}
public class CookedFoodReduction implements FullReduction {
    
    

	@Override
	public Long reduction(Long amount) {
    
    
		if (amount >= 10_000) {
    
    
			return amount - 1000;
		} else {
    
    
			return amount;
		}
	}

}

3.3戦略使用クラスの作成

public class Order {
    
    

	private FullReduction reduction;

	private Long amount;

	public Order(FullReduction reduction, Long amount) {
    
    
		super();
		this.reduction = reduction;
		this.amount = amount;
	}

	public Long count() {
    
    
		return reduction.reduction(amount);
	}

}

3.4レジを作成する

public class Cashier {
    
    

	public static void main(String[] args) {
    
    
		List<Order> list = new ArrayList<Order>();
		list.add(new Order(new MeatReduction(), 124 * 100l));
		list.add(new Order(new CookedFoodReduction(), 140 * 100l));
		list.add(new Order(new VegetablesReduction(), 53 * 100l));
		Long amount = count(list);
		System.out.println("您消费总金额为:" + (amount / 100) + "元");
	}

	/**
	 * @Title: count
	 * @Description: TODO
	 *
	 */
	private static Long count(List<Order> list) {
    
    
		Long amount = 0l;
		for (Order order : list) {
    
    
			amount += order.count();
		}
		return amount;
	}
}

演算結果:
ここに画像の説明を挿入

4.戦略モデルの長所と短所のビジネス分析を通じて

上記のコードを比較することで、戦略モードのいくつかの特性を簡単に分析できます。
利点:

  1. ストラテジーモードは、継承関係を置き換え、集約によって継承を減らすことができます。
  2. ストラテジーモードは、冗長なif-else判定コードブロックを減らすことができます。対応するアルゴリズムは、アルゴリズムによる意思決定を通じて使用できます。
  3. 戦略モードは、開始と終了の原則の要件を満たしています。拡張と開始の場合、新しい戦略は既存の戦略に影響を与えません。

短所:

  1. クライアントはすべての戦略を知っており、使用する戦略を決定する必要があります。
  2. ストラテジーモードは多くのストラテジークラスを生成し、オブジェクトの数を増やします。

3つ目は、Javaの戦略パターンです。

1.戦略モデルの設計アイデア

上記のコードを読んでもまだ質問がある場合は、それは正常だと思います。上記の戦略パターンはコードを提供しますが、パターン全体の設計アイデアは詳細に説明されていないためです。ここでは、最初に戦略モードの構成図を描いて、誰もが戦略モードをさらに理解できるようにします。

ここに画像の説明を挿入
実際、戦略モデルは非常に単純です。

  1. 最初のステップ:最初にポリシー制約インターフェースを作成して、目的のポリシーに必要な動作を制限します。
  2. ステップ2:ストラテジーインターフェイスの実装クラスを作成し、新しいストラテジーごとに実装クラスを追加します。
  3. 3番目のステップ:戦略を参照するコンテキスト選択コンバイナーを作成して、戦略とビジネスの組み合わせを実装します。
  4. ステップ4:プログラムでビジネスに必要な戦略を指定します。

2.JDKの戦略モード

2.1コンパレータインターフェース

Javaでの戦略インターフェースの最も一般的な実装はComparatorインターフェースです。Comparatorインターフェースのsortメソッドは、さまざまなタイプのオブジェクトに対してさまざまなソート戦略を提供します。カスタムオブジェクトの並べ替えを実装する場合は、カスタムオブジェクトの並べ替えルールを渡す必要があります。これはComparatorインターフェイスの実装です。ここでは、友人が分析できるように、コンパレータにsortメソッドのソースコードを実装するための配列を投稿します。
ここに画像の説明を挿入

4、まとめ

1.戦略モードの機能:

利点:

  1. ストラテジーモードは、継承関係を置き換え、集約によって継承を減らすことができます。
  2. ストラテジーモードは、冗長なif-else判定コードブロックを減らすことができます。対応するアルゴリズムは、アルゴリズムによる意思決定を通じて使用できます。
  3. 戦略モードは、開始と終了の原則の要件を満たしています。拡張と開始の場合、新しい戦略は既存の戦略に影響を与えません。

短所:

  1. クライアントはすべての戦略を知っており、使用する戦略を決定する必要があります。
  2. ストラテジーモードは多くのストラテジークラスを生成し、オブジェクトの数を増やします。

2.戦略モードのシナリオを使用する

  1. 複数のエンティティ間でのみ異なる動作をします
  2. システムは、複数のアルゴリズムから動的に選択する必要があります。

3.戦略モデルによって解決される問題

1.デカップリング:ストラテジーモードは「開閉原理」を完全にサポートし、ユーザーは元の基本システムを変更せずに実装方法を選択でき、新しい実装を柔軟に追加することもできます。簡単に言えば、1つのアルゴリズムの追加と変更は、他のアルゴリズムに影響を与えません。
2.効果的な実装クラス管理:同じインターフェースを実装するためのさまざまな管理方法を提供します。ポリシー管理ロールが存在するため、特定のポリシーロールの呼び出し方法が集中しています。
3.継承関係を置き換える:継承関係を置き換える方法を提供します。
4.複数の条件付き転送を置き換える:複数の条件付き転送ステートメントの使用は避けてください。

さて、今日のコンテンツは以上です。やりがいのある友達がワンクリックで3つのつながりを作れることを願っています!売春の拒否は私から始まります。

おすすめ

転載: blog.csdn.net/xiaoai1994/article/details/112266997