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