デザインパターンシリーズ(A) - 戦略モード

コンセプト:   

      ソフトウェアのデザインパターンとしての戦略パターンは、行動を持っていますが、別のシナリオでは、行為が異なるアルゴリズムを持っているオブジェクトを参照します。(ウィキペディア)

概念を理解します:

      コンセプト、戦略パターンが異なるシナリオで異なるアルゴリズムの動作であることを特徴とします。分離部分が変更と不変部分:私たちは、設計原理は、これはそこにあることを知っています。この概念では、我々は知ることができます。同じ場所には、この動作は、変更され、このアルゴリズムの実装が行うために必要な、または戦略です。

シナリオ:

      アプリケーションシナリオのこのモードでは、このようにする必要があります。私たちは、私たちが望む最も適切な機能を選択することができます番号を実装する必要があります。Javaの6月、パスカル6月、スカラ座6月3人が夕食のためにレストランに行くために:簡単な例を取ります。しかし、その後、彼らの個人的な味の3は同じではありませんが、Javaのジュンは、夕食を食べ、オブジェクト指向、パスカル・ジュンは、プロセス指向の夕食を食べて、そしてスカラ座ジュン機能夕食を食べて、あなたはレストランのウェイターあると仮定すると、この時間は、あなたがすべての与えます個々の食事の時間、我々は書くべき

if(pascal君) return 面向过程大餐;else 
if(java君)return 面向对象大餐;else
if(scala君)return 函数式大餐;

それは残念です。氏が来た場合には、スプリングAOPは夕食を食べたいので、ソースコードを変更する必要があります。これが私たちの原則「のオープンを拡大し、修正のために閉鎖」に沿ったものではありません。したがって、この設計では十分ではありません。

 

解決策:

      我々は物事を変更し、不変の分離と述べました。変更は、さまざまな料理に異なる人々になることです。私たちは、コードから分離少し置きます。個別にカプセル化されました。多型の使用、能力各カテゴリの食品のいくつかの種類をポイントします。私たちは、誰もが、その後、このメソッドを実装アラカルトアプローチを注文する一人一人の時間を直接呼び出すために皆のためのアラカルトをこのように定義する注文インターフェイスを実現することができます。新しい人が入ってくるのであれば、私たちは彼らのための方法を実現するための新しい人々がすることができようにする、元のコードを変更しないでください。これは、設計の原則に従うでしょう。ここでは、コードです。

/*
 * Created by 王镜鑫 on 2016/10/7
 */
interface Order//点餐接口
{
    public void order();//点餐方法
}
class JAVA implements Order//java君实现点餐接口
{
    public void order()
    {
        System.out.println("I want a Object Oriented meal");
    }
}
class Pascal implements Order//Pascal君实现点餐接口
{
    public void order()
    {
        System.out.println("I want a Procedure Oriented meal");
    }
}
class Scala implements Order//Scala君实现点餐接口
{
    public void order()
    {
        System.out.println("I want a functional meal");
    }
}
public class Restaurant//餐厅
{
    private Order order = null;
    public void setOrder(Order order)//设置点餐的人。
    {
        this.order = order;
    }
    public void order()//让点餐人点餐
    {
        order.order();
    }

    public static void main(String[] args)
    {
        Restaurant restaurant = new Restaurant();//实例化一个餐厅
        restaurant.setOrder(new JAVA());//将java君设置进去
        restaurant.order();//让java君点餐
        restaurant.setOrder(new Pascal());//将Pascal君设置进去
        restaurant.order();//让Pascal君点餐
        restaurant.setOrder(new Scala());//将Scala君设置进去
        restaurant.order();//让Scala君点餐
    }
}

次のように出力されます。

私はオブジェクト指向の食事たい
私は手順指向食事をしたいが
、私は機能的な食事をしたいです

目に見える、Javaの6月、パスカル6月、Scalaの6月には、夕食を食べるために、自分の希望を食べなければなりません。そして再びタイムリーのコンパイル、先生は、我々はあなたが元のコードを変更しない、恐れていません。あなただけがそれを実装することができ氏の発注インタフェースのコンパイル中にクラスを追加する必要があります。

精錬概要:

      ここでは、例を使用しています。いわゆるシナリオ戦略モードを説明するために、どのように問題を解決するための戦略パターンを適用するために、結合を低減、展開するコードをより容易にします。我々の下にはポリシーモードをまとめます。
      上記の例では、我々は戦略パターンは次の役割が含まれていることを知っています:

  •   コンテキスト:Contextクラスは、パッケージ、ポリシーモジュールの上部シールドの直接アクセスを接続する役割を果たしています。
  •   戦略:戦略抽象クラス。通常抽象(抽象クラ​​スまたはインタフェース)各ポリシーのために定義されなければならない、いくつかのメソッドとプロパティ。
  •   ConcreteStrategy:具体的な戦略のクラスは、特定のポリシーを達成することです。

次の図の関係:

11-1.png

プロパティの文脈での戦略があり、政策、加工方法を設定する方法があります。加工方法は、戦略の作業方法で実装されています。具体的な戦略と具体的な戦略は、作業方法を実現するために、戦略Bのインターフェイスを実装します。この文脈では、作業メソッド呼び出し、メソッドは、新しい戦略があった場合にできるだけの再宣言クラスポリシーに必要な、実際にデカップリング戦略と具体的な戦略の実現を達成するための具体的な戦略を設定し、作業を呼び出すことです。
      戦略モードは非常にシンプルなデザインパターンである、戦略パターンが異なるアルゴリズムのパッケージである、とアルゴリズムの責任アルゴリズム自体が分離、アルゴリズムが異なるオブジェクト管理に割り当てられ、一つの文章では、戦略パターンであります:家族のアルゴリズムが実装され、各アルゴリズムが一緒にパッケージされている、彼らが入れ替わります。
      システムの柔軟性を増加させるが、ある程度、また、クライアントの使用の難しさを増加しているユーザによって決定され、使用する戦略戦略モード。クライアントは別のアルゴリズムの違いを理解する必要があるため、適切なアルゴリズムを選択します。インタフェースプログラミングのための、というよりもプログラミング:Strategyパターンはまた、このような原理のデザインを反映しています。戦略モードは、インタフェース、多状態の挙動の代表と、ワークのコンテキストで実行される動作は、このインターフェースの具体的な実装です。私たちは、JDK公式ランキング方法を考えるために使用されます。Colloctions.sort(リスト<T>リスト)と彼のオーバーロードメソッドソート(リスト<T>のリスト、コンパレータは、<?スーパーT> C) それらの実装は、直接法は、着信間の差がある、リストの並べ替えを呼び出していますコンパレータがnullの場合、素子TリストはComparablelインターフェースをも達成され、特定のコンパレータ、nullの比較方法に導入されます。これは、戦略パターンの典型的なアプリケーションです。それは、あるクラスのソート特定のニーズを作るために、並べ替え、理由は異なるニーズがソート照合クラスでは、ポリシーがないと同じである、つまり、同じではありませんので、我々は、クラスをソートするクライアント部分、すなわち、特定のニーズにポリシーパッケージを置きます同等のインタフェースを実装し、次にソートアルゴリズムは、直接時間のために、2つの要素を比較するために、そのcompareToメソッドを呼び出すときソートアルゴリズムに渡される、マルチ状態に応じて、自分のコールが実際に特定compareToメソッドに渡され。、特定のサブクラスの比較戦略にカプセル化されている特定の順序ように実現することができます。これは、順序での戦略パターンのアプリケーションです。
限られた知識を、私にメッセージを修正することを歓迎記事や間違った場所での省略は、あります。

 

ます。https://my.oschina.net/u/3023191/blog/1842378で再現

おすすめ

転載: blog.csdn.net/weixin_33671935/article/details/92369139