JavaScript設計モード(二):戦略モード


戦略モード:一連のアルゴリズムを定義して、それらを一つずつカプセル化し、それらを相互に置き換えることができる.
生活栗:諸葛錦嚢
諸葛は劉備に最善を尽くし、いかなる困難にも対処策を講じた.戦略パターンが実現されるのも同様のシーンである.
もう一つの栗:好きな女の子にアイスクリームを買ってあげます.好みが分かりません.いろいろな味をそろえて、いつも当たります.つまり「お金がかかります」というのが、ポリシーモードの欠点でもありますので、あらかじめあらゆるシーンを考えておく必要があります.
パターンの特徴
  • ポリシークラス:アルゴリズムは独立した関数/オブジェクト
  • にカプセル化される.
  • 環境クラス:異なるパラメータから対応するポリシー関数/オブジェクトを呼び出して
  • を実行する.
    パターン実現
    実施形態:1つのポリシーモードに基づくプログラムは少なくとも2つの部分から構成され、最初の部分はポリシークラスのStrategies(可変)であり、ポリシークラスのパッケージ類の具体的なアルゴリズムであり、具体的な計算プロセスを担当する.第二の部分は環境種類のContect(不変)で、Contectはお客様の要求を受け取って、その後要求をある一つの戦略類に委託します.
    私たちは開発チームと仮定して、人員構成は(開発リーダー、後端、先端、テスト)を含みます.開発リーダーは開発任務を受領しますが、具体的な任務執行者は種類によって分けられます.
    例えば開発タスクには以下の項目があります.
  • サーバキャッシュ(バックエンドタスク)を最適化する
  • ファーストスクリーンローディング速度(フロントエンドタスク)を最適化する
  • システム同時試験(テストタスク)を完了しました.
    開発チーム長は、タスクの種類によって、対応する開発者に配属されます.組長は具体的な開発任務を担っていません.ですから、開発者一人がStrategyの役割を担っています.チーム長はすべての開発者の資源を持っていて、コントロールできる役割をしています.チームの各開発者は「グループ」というのはStrategies類です.このStrategiesは可変です.もし後続の開発任務にはAndroid、IOSのサポートが必要です.Android、IOSの開発者配置を追加すればいいです.
    //    (    )
    var Strategies = {
        "backend": function(task) {
            console.log('      :', task);
        },
        "frontend": function(task) {
            console.log('      :', task);
        },
        "testend": function(task) {
            console.log('      :', task);
        }
    };
    
    //     (    )
    var Context = function(type, task) {
        typeof Strategies[type] === 'function' && Strategies[type](task);
    }
    
    Context('backend', '       ');
    Context('frontend', '        ');
    Context('testend', '        ');
    上記コードのメリット:
  • アルゴリズムは独立してパッケージ化され、タスクは配布される.開発リーダーは具体的な開発任務を担当していません.
  • 多重性がより良く、Contect呼び出しに限定されない.開発者は家のことを心配しないでください.
    ポリシーパターンのもう一つの利点は、if...else/switch...case条件分岐文の大部分を除去し、コードの読み取り性を向上させることである.
    //            ...
    var Context = function(type, task) {
        if (type === 'backend') {
            //        
        } else if (type === 'frontend') {
            //        
        } else if (type === 'testend') {
            //        
        }
    }
    JavaScriptでは、関数は「1等公民」として、「1等対象」とも言われています.JavaScriptでは、高次関数「適用中、関数は変数またはパラメータとして伝達または呼び出すことができます.したがって、JavaScriptでは、アルゴリズムを独立した関数にパッケージして、パラメータとして別の関数に渡すことができます.
    //        
    var backend = function(task) {
        console.log('      :', task);
    };
    var frontend = function(task) {
        console.log('      :', task);
    };
    var testend = function(task) {
        console.log('      :', task);
    };
    
    //     (    )
    var Context = function(func, task) {
        typeof func === 'function' && func(task);
    }
    
    Context(backend, '       ');
    Context(frontend, '        ');
    Context(testend, '        ');
    ストラテジスト系の外層小包が少なくなり、機能がより独立して、その呼び出しを妨げないようになりました.
    適用シーン
  • 多重条件文判断により、対応するアルゴリズムシーン
  • が実行される.
  • フォーム検証
  • 長所と短所
  • 長所:
  • 複合条件選択文if...else/switch...caseを避けるために、結合、委託、多状態の技術と思想を利用する.
  • の多重性がより高く、アルゴリズム関数はシステムの他の場所で使用されてもよい.
  • は、設計モード「開発・閉鎖の原則」をサポートし、独立したストラテジーにパッケージ化したアルゴリズムで、メンテナンスと拡張が容易である.
  • ポリシーモードは、「組み合わせと委託」を使用して、Conteextにアルゴリズムを実行する能力を持たせ、オブジェクト継承を代替する実行可能なスキーム
  • を有する.
  • 欠点:
  • は多くの策略類または対象を増加しました.
  • 各Strategyの違いを知る必要があります.「最小知識原則」に違反します.
  • JavaScriptデザインモード整理シリーズが更新されていますので、コラム「先端攻撃の巨人」に注目してリアルタイムで更新してください.
    参考文献
  • 「JavaScript設計モード」
  • 「JavaScript設計モードと開発実践」
  • 「JavaScript設計モードシステム解説と応用」
  • 本記事の第1弾Githubは、Starを期待しています.https://github.com/ZengLingYong/blog
    作者:以楽之名
    この文章はオリジナルで、不適切なところがあります.転載は出典を教えてください.