JS設計モード14(戦略モード)


ポリシー・モード


一連のアルゴリズムを定義し、それらを1つずつカプセル化し、互いに置き換えることができます.このモードでは、アルゴリズムを使用するお客様とは独立して変更できます.ポリシー・モードは、1つのクラスで頻繁に変更されたり、将来変更される可能性がある部分をインタフェースとして抽出し、クラスにこのオブジェクトを含むインスタンスであり、クラスのインスタンスが実行時にこのインタフェースを実現したクラスの動作を任意に呼び出すことができる.

ポリシー・モード要素


1.Strategy:一連の特定のポリシーアルゴリズムを制約するためのポリシーインタフェース.Contextはこのインタフェースを使用して特定のポリシーを呼び出し,定義されたポリシーを実現する.2.ConcreteStrategy:具体的な策略の実現、つまり具体的なアルゴリズムの実現.3.Context:コンテキストは、特定のポリシーとのインタラクションを担当し、通常、コンテキストは真のポリシー実装を持っています.

≪インスタンス|Instance|emdw≫


現在、車の価格は市場の需要変動に応じて随時調整され、異なる販売業者の注文台数に対して優遇される可能性がある.
//     

var DP = require("./DesignPattern.js");
function Strategy() {
  DP.Interface(this, ['calPrice']);
}

function Nodiscount() {
  this.__proto__ = new Strategy();
  this.calPrice = function (price, num) {
    return price * num;
  }
}

function Disount1() {
  this.__proto__ = new Strategy();
  this.calPrice = function (price, num) {
    return price * num * 0.95;
  }
}

function Context(strategy) {
  var _strategy=strategy;
  this.calPrice = function (price, num) {
    return _strategy.calPrice(price, num)
  }
}

var nodiscount = new Nodiscount();
var disount1 = new Disount1();

var nodiscountContext = new Context(nodiscount);
console.log("Nodiscount    3    : " + nodiscountContext.calPrice(10000,3));
var disount1Context = new Context(disount1);
console.log("disount1    3    : " + disount1Context.calPrice(10000,3));

ポリシー・モードの利点:


1.アルゴリズムは自由に切り替えることができる.2.複数条件での判断は避ける.3.拡張性が良い.
ポリシー・モードの欠点:1.ポリシークラスが増えます.2.すべての戦略類は外部に暴露する必要がある.
適用シーン:1.1つのシステムに多くのクラスがあり、それらの違いがそれらの動作だけにある場合、ポリシーモードを使用すると、1つのオブジェクトが多くの動作の中で1つの動作を動的に選択することができます.2.1つのシステムは、いくつかのアルゴリズムの中から1つを動的に選択する必要がある.3.1つのクラスは複数の動作を定義し、これらの動作はこのクラスの動作において複数の条件文として現れる.条件文の代わりに、関連する条件分岐をそれぞれのStrategyクラスに移動します.