戦略パターン
1.戦略モードとは
戦略パターン:一連のアルゴリズムクラスを定義し、各アルゴリズムをカプセル化して、それらを相互に置き換えることができます。戦略パターンにより、アルゴリズムを使用する顧客とは無関係に変更できます。これは、ポリシーパターン(ポリシー)とも呼ばれます。 。
ストラテジーモードは、オブジェクトの動作モードです。
ストラテジーモードの主な目的は、アルゴリズムの定義と使用を分離すること、つまり、アルゴリズムの動作を環境から分離し、アルゴリズムの定義を特別なストラテジークラスに配置することです。各ストラテジークラスは、実装をカプセル化します。アルゴリズム。環境クラスは抽象戦略クラス用にプログラムされており、「依存関係反転の原則」に準拠しています。新しいアルゴリズムが登場したら、抽象戦略クラスを実装する新しい具体的な戦略クラスを追加するだけで済みます。
戦略モードは、アルゴリズムのカプセル化であり、アルゴリズムの責任をアルゴリズム自体から分離し、さまざまなオブジェクト管理に委任します。戦略パターンは通常、一連のアルゴリズムを一連の具体的な戦略クラスに抽象戦略クラスのサブクラスとしてカプセル化します。
ストラテジーモードでは、環境クラスと抽象ストラテジークラスを理解することが非常に重要です。環境クラスは、アルゴリズムを使用する必要があるクラスです。システムには複数の環境クラスが存在する可能性があり、それらは同じアルゴリズムのいくつかを再利用する必要がある場合があります。
ストラテジーモードは、アルゴリズムの自由な切り替えと拡張に使用され、最も広く使用されている設計モードの1つです。
戦略モードは、特定の問題を解決するためのアルゴリズムのファミリーに対応し、ユーザーが特定の問題を解決するためにアルゴリズムのファミリーからアルゴリズムを選択できるようにすると同時に、アルゴリズムを簡単に置き換えたり、新しいアルゴリズムを追加したりできます。アルゴリズムのカプセル化、多重化、および切り替えが含まれる限り、戦略モードを検討できます。
2.戦略パターンの役割分析
戦略モードの構造図:
- コンテキスト(環境クラス):環境クラスはアルゴリズムの役割であり、特定の問題を解決する(つまり、特定のメソッドを実装する)ときにさまざまな戦略を使用できます。採用された戦略を定義するために、環境クラスの抽象戦略クラスへの参照インスタンスを維持します。
- ストラテジー(抽象ストラテジークラス):サポートされているアルゴリズムの抽象メソッドを宣言し、すべてのストラテジークラスの親クラスです。抽象クラス、具象クラス、またはインターフェイスにすることができます。環境クラスは、抽象戦略クラスで宣言されたメソッドを介して、実行時に具象戦略クラスに実装されたアルゴリズムを呼び出します。
- ConcreteStrategy(特定の戦略クラス):抽象戦略クラスで宣言されたアルゴリズムを実装します。実行時に、具体的な戦略クラスは環境クラスで定義された抽象戦略クラスオブジェクトをオーバーライドし、特定のアルゴリズムを使用して特定のビジネスプロセスを実装します。 。
3.戦略モデルの長所と短所
利点:
- ストラテジーモードは、「開閉原理」を完全にサポートします。ユーザーは、元のシステムを変更せずにアルゴリズムや動作を選択したり、新しいアルゴリズムや動作を柔軟に追加したりできます。
- ストラテジーモードは、関連するアルゴリズムファミリを管理する方法を提供します。ストラテジークラスの階層構造はアルゴリズムまたは動作ファミリーを定義し、継承を適切に使用すると、共通コードを抽象ストラテジークラスに移動できるため、コードの重複を回避できます。
- 戦略モードは、継承関係を置き換える方法を提供します。ストラテジーモードが使用されていない場合、アルゴリズムを使用する環境クラスにはいくつかのサブクラスがあり、各サブクラスは異なるアルゴリズムを提供します。ただし、このように、アルゴリズムの使用は、「単一責任の原則」に準拠していないアルゴリズム自体と混合されます。使用するアルゴリズムを決定するロジックは、アルゴリズム自体と混合され、進化することは不可能です。独立して;そして継承を使用することは、プログラムの実行中にアルゴリズムまたは動作の動的な切り替えを実現することはできません。
- 戦略モードを使用すると、複数の条件付き選択ステートメントを回避できます。複数の条件付き選択ステートメントは、保守が容易ではありません。アルゴリズムまたは動作を採用するロジックと、アルゴリズムまたは動作自体の実装ロジックを組み合わせて、それらすべてを巨大な複数の条件付き選択ステートメントにハードコードします。直接の方法環境クラスの継承は原始的で後方です。
- ストラテジーモードは、アルゴリズムの再利用メカニズムを提供します。アルゴリズムは個別に抽出され、ストラテジークラスにカプセル化されるため、さまざまな環境クラスでこれらのストラテジークラスを簡単に再利用できます。
短所:
- クライアントは、すべての戦略クラスを知っており、使用する戦略クラスを決定する必要があります。これは、適切なアルゴリズムを時間内に選択するために、クライアントがこれらのアルゴリズムの違いを理解する必要があることを意味します。言い換えると、戦略モードは、クライアントがすべてのアルゴリズムまたは動作を知っている場合にのみ適用できます。
- ストラテジーモードでは、システムが多くの特定のストラテジークラスを生成し、小さな変更があると、システムは新しい特定のストラテジークラスを追加します。
- クライアントで複数のストラテジークラスを同時に使用することはできません。つまり、ストラテジーモードを使用する場合、クライアントは一度に1つのストラテジークラスしか使用できません。1つのストラテジークラスを使用して一部を完了することはサポートされていません。関数を実行してから、別の戦略クラスを使用して残りの関数を完了します。
該当するシーン:
- システムはいくつかのアルゴリズムの1つを動的に選択する必要があります。そうすると、これらのアルゴリズムを特定のアルゴリズムクラスにカプセル化でき、これらの特定のアルゴリズムクラスはすべて抽象アルゴリズムクラスのサブクラスになります。言い換えれば、これらの特定のアルゴリズムクラスはすべて統一されたインターフェースを持っています。「リッチスティール置換原則」とオブジェクト指向ポリモーフィズムによれば、クライアントは特定のアルゴリズムクラスを使用することを選択でき、抽象アルゴリズムとして1つのデータ型を維持するだけで済みます。クラスオブジェクト。
- オブジェクトには多くの動作があります。適切なモデルを使用しない場合、これらの動作は複数の条件付き選択ステートメントを使用してのみ実現できます。この時点で、ストラテジーモードを使用してこれらの動作を対応する特定のストラテジークラスに転送することで、維持が困難な複数の条件付き選択ステートメントの使用を回避できます。
- クライアントは、アルゴリズムに関連する複雑なデータ構造を知りたくありません。アルゴリズムと関連するデータ構造を特定の戦略クラスにカプセル化すると、アルゴリズムの機密性とセキュリティを向上させることができます。
4. 实操感想
目的は明確で理解しやすいです。
戦略はお互いを知りませんし、お互いに通信しません。
5.コード例
// 抽象策略类
abstract class AbstractStrategy {
public abstract void algorithm(); //声明抽象算法
}
// 具体策略类
class ConcreteStrategyA extends AbstractStrategy {
//算法的具体实现
public void algorithm() {
//...
}
}
// 环境类,使用算法的角色类
class Context {
private AbstractStrategy strategy; //维持一个对抽象策略类的引用
public void setStrategy(AbstractStrategy strategy) {
this.strategy= strategy;
}
//调用策略类中的算法
public void algorithm() {
strategy.algorithm();
}
}
// 测试
public static void main(String[] args) {
Context context = new Context();
AbstractStrategy strategy = new ConcreteStrategyA(); //可在运行时指定类型
context.setStrategy(strategy);
context.algorithm();
}