【JS設計モード】ポリシーモードのコード例


ポリシー・モードの概念参照:
ソフトウェア開発でもよく似たような状況に遭遇し、ある機能を実現するには多くのアルゴリズムやポリシーがあり、環境や条件によって異なるアルゴリズムやポリシーを選択して機能を完成することができます.
検索、ソートなどの一般的な方法は、ハードコーディング(Hard Coding)が1つのクラスにおいて、複数の検索アルゴリズムを提供する必要がある場合、これらのアルゴリズムを1つのクラスに書き込むことができ、このクラスに複数の方法を提供することができる.
各メソッドは、特定の検索アルゴリズムに対応する.もちろん、これらの検索アルゴリズムを統一的な方法にカプセル化し、if...else...やcaseなどの条件判断文で選択することもできます.
この2つの実装方法はいずれもハードコーディングと呼ぶことができ、新しい検索アルゴリズムを追加する必要がある場合は、パッケージアルゴリズムクラスのソースコードを修正する必要があります.検索アルゴリズムを交換するか、クライアント呼び出しコードを変更する必要があります.
このアルゴリズムクラスには大量の検索アルゴリズムがカプセル化されており,このクラスコードは複雑になり,メンテナンスが困難になる.これらのポリシーをクライアントに含めると、この方法はさらに望ましくなく、クライアント・プログラムが膨大でメンテナンスが困難になります.
選択可能なアルゴリズムが多数存在する場合、問題はさらに深刻になる.
例:
一、旅行:自転車、車、汽車、飛行機に乗ることができるいくつかの戦略を考えることができます.各ポリシーは同じ結果を得ることができますが、異なるリソースを使用しています.
選択戦略の根拠は費用、時間、使用ツール、そしてそれぞれの方法の便利さです.
二、あるショッピングモールで、メーデーにイベントをしたので、図書類の商品は購入金額によって以下の割引戦略をしました.
1、199元で購入し、10%割引する
2、購入金額が399元で、2割引になります
3、購入が599元以上で、7割引になります.
function BookStrategy() {
  this.calcPrice = function( price ) {
    console.log("    = " + price);
  }
}
function BookCalc9Strategy() {
  this.calcPrice = function( price ) {
    console.log("   :"+ price +"; 9  :" + (price * 0.9));
  }
}


function BookCalc8Strategy() {
  this.calcPrice = function( price ) {
    console.log("   :"+ price +"; 8  :" + (price * 0.8));
  }
}


function BookCalc7Strategy() {
  this.calcPrice = function( price ) {
    console.log("   :"+ price +"; 7  :" + (price * 0.7));
  }
}
function PriceCalc( _strategy ) {
  this.strategy = _strategy;
  this.getPrice = function( price ) {
    return this.strategy.calcPrice( price );
  }
}
function Client() {


  var price = 100;
  var priceCalc = null;
  if ( 199 <= price && price < 399 ) {
    priceCalc = new PriceCalc(new BookCalc9Strategy());
  } else if ( 399 <= price && price < 599 ) {
    priceCalc = new PriceCalc(new BookCalc8Strategy());
  } else if ( 599 <= price ) {
    priceCalc = new PriceCalc(new BookCalc7Strategy());
  } else {
    priceCalc = new PriceCalc(new BookStrategy());
  }


  priceCalc.getPrice(price);


}
Client();