JDKソースコードと組み合わせて設計モードを見る--戦略モード

8170 ワード


前言:
今、電子商取引はすでに私たちの生活の中で欠かせないショッピングルートになっています.同時に、各大手企業は異なる時間に対して異なる割引をします.これは私たちから見ればマーケティング手段であり、戦略でもあります.今日はJDKの戦略モデルがどのようなものなのかについてお話しします.
一、定義
アルゴリズムファミリーを定義し、それぞれカプセル化して互いに置き換えることができ、アルゴリズムの変化がアルゴリズムを使用するユーザーに影響を与えないようにします.大量のifを除去するために使用できます...Else構造.
二、適用シーン
1、システムには多くの種類があり、それらの違いはそれらの行為の違いにある.
2、一つのシステムは動的にいくつかのアルゴリズムの中で一つを選択する必要がある
ここで少し理解すると、ポリシー・モードは実際にはファクトリ・モードに似ていますが、ファクトリ・モードは作成型であり、コマンドを受信して対応するファクトリを作成し、ポリシー・モードは作成されたポリシーを転送して具体的な動作を実現します.行動とアルゴリズムを重点的に理解する.実はただ私达が异なる业务のシーンによって异なる反応をして、宝を洗うことを持って、双十一の贩促活动の力度は最も大きくて、5割引になるかもしれなくて、女王の节は普通は7割引になります.この2つの異なるオブジェクトに対して、2つの異なる動作または異なるアルゴリズムがあり、クライアントが呼び出すと、対応するポリシーに直接アクセスして対応する動作を行うことができます.JDKでの戦略パターンの応用を具体的に見てみましょう
三、Comparatorにおける策略モード
まず、ポリシー・モードでどのような役割が必要なのかを確認します.
1、抽象戦略の役割
責任定義は、通常、インタフェースまたは抽象クラスによって実装されます.このロールは、すべての特定のポリシークラスに必要なインタフェースを示します.
2、策略実現クラス
異なるクラスは具体的に異なるアルゴリズムを実現する.
3、環境役割クラス
抽象的なポリシーロールの参照が含まれており、クライアントは特定の方法で異なるパラメータを伝達したり、クラスを実装したりして異なるアルゴリズムを得ることができます.
私たちは今Arraysというクラスを直接見ています.
public class Arrays{
    public static  void sort(T[] a, Comparator super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }
}

Arraysは環境キャラクタクラスで、このsortメソッドはArraysをこのメソッドに従ってソートする新しいポリシーを伝えることができます.たとえば、次のテストクラスです.
public class Test1 {

    public static void main(String[] args) {
        Integer []data ={12,2,3,2,4,5,1};
//       ,  -1   ,1   ,0    
        Arrays.sort(data, (str1, str2) -> {
            if (str1.compareTo(str2) > 0) {
                return -1;
            } else {
                return 1;
            }
        });
        System.out.println(Arrays.toString(data)); //[12, 5, 4, 3, 2, 2, 1]
    }
}

ここでは直接lambda式を用いてComparatorインタフェースのcomparareを書き換える方法であり,ここでのlambda式が具体的なアルゴリズムであると考えられ,Comparatorが抽象戦略の役割を果たしていることがわかる.環境キャラクタクラスは抽象的なポリシーの参照を持って呼び出すべきだと述べましたが、ArraysクラスのsortメソッドはComparatorインタフェースを直接伝えるもので、独自のcomparareメソッドがあれば次のメソッドに入ります.
class TimSort {
    static  void sort(T[] a, int lo, int hi, Comparator super T> c,
                         T[] work, int workBase, int workLen) {
        assert c != null && a != null && lo >= 0 && lo <= hi && hi <= a.length;

        int nRemaining  = hi - lo;
        if (nRemaining < 2)
            return;  // Arrays of size 0 and 1 are always sorted

        // If array is small, do a "mini-TimSort" with no merges
        if (nRemaining < MIN_MERGE) {
            int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
            binarySort(a, lo, hi, lo + initRunLen, c);
            return;
        }
    private static  int countRunAndMakeAscending(T[] a, int lo, int hi,
                                                    Comparator super T> c) {
        assert lo < hi;
        int runHi = lo + 1;
        if (runHi == hi)
            return 1;

        // Find end of run, and reverse range if descending
        if (c.compare(a[runHi++], a[lo]) < 0) { // Descending
            while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) < 0)
                runHi++;
            reverseRange(a, lo, runHi);
        } else {                              // Ascending
            while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) >= 0)
                runHi++;
        }

        return runHi - lo;
    }
}

ここでは、上記のコードで最終的にcountRunAndMakeAscendingという方法に走ります.compareメソッドのみが使用されているため、Arraysを呼び出していることがわかります.sortメソッドは,特定のcomparator書き換えメソッドのクラスのみを伝達すればよいが,これもComparatorインタフェースでサブクラス実装が必要なメソッドである.
四、まとめ
実はこんなに多くのモードを学んで、あなたはこれらのモードの大体が似ていることを発見することができて、しかし細かく研究してまた似ていません.戦略モデルは工場モデルと混同されやすい.戦略モデルの核心は異なる行為が異なるアルゴリズムに対応することであり、工場は異なる製品を生産し、製品に規定されたパラメータと戻りタイプを与えることが多い.