[設計模式] javascript 之 策略模式

來源:互聯網
上載者:User

[設計模式] javascript 之 策略模式
定義: 封裝一系列的演算法,使得他們之間可以相互替換,本模式使用演算法獨立於使用它的客戶的變化。 說明:策略模式,是一種組織演算法的模式,核心不在於演算法,而在於組織一系列的演算法,並且如何去使用它;策略模式作用在於,行為實現的不可預見,面對這樣的一種變化,我們得思考如何使用程式好維跟擴充,並使得客戶很好的使用演算法的方式; 策略模式 使用要注意它 "變化" 的一面,策略模式就是來解決這個 變化 問題的。 比如商場買賣的價格或促銷問題,如果不使用模式,就可能只是 把“所有”的情況用 if else 類似“寫入程式碼” 的開式寫在一起,或是傳個傳個參數,稍加點內部邏輯代碼,最好就是一同寫在一個類裡面; P如:  function Price(personType, price) {    //大客戶 5 折    if (personType == 'vip') {        return price * 0.5;    }     else if (personType == 'old'){ //老客戶 3 折        return price * 0.3;    } else {        return price; //其他都全價    }} 我們把上面的看成一個類,如果要擴充一種價格手段,就得在 Price 裡添加新的 else if,或是修改某個演算法邏輯,就得某個 if 或 else if 裡修改, 這是對單個類的修改,而且這種情況勢必得經常修改這個類,這違反了設計模式的一個原則:對修改關閉,對擴充開放的原則; 而且這些演算法,在不同客戶面前可能會經常替換,固定參數也不能滿足需求; 解決這種問題就可以使用原則模式,策略在於關注變化,把各行為不同的實現各自封裝起來,比如要實現一隻動物,走路,叫聲,吃東西的各種表現,就可以把走路,叫聲,吃東西,就可以定義三個介面抽象,然後把他們各自具體實現去實現三個介面;   前面說,策略模式是使演算法可獨立於使用的客戶的改變,所以策略模式裡,一般是在用戶端定義選擇使用的演算法,傳入相應的參數,再根據演算法返回結果;    這種有點類似簡單原廠模式,這種再加層 Context 是為了客戶使用起來更簡單調用,不必自處理一些邏輯,讓團隊開發,更趨一致;Context 也可以做成一個基類,其下可以有多個實現子類繼承; Context 跟 Client 可以改為:   繼承子類只需引用自己的實現介面演算法,即可,這樣客戶可以更簡單的調用,也不必理會各種動物使用什麼介面,是怎麼實現的了; 執行個體源碼  這裡以上面的商場價格手段來實現: 1. 實現幾種演算法,Javascript是弱類型,沒有介面這號東西,就是直接寫了; vip 客戶 function vipPrice() {    this.discount = 0.5;} vipPrice.prototype.getPrice = function(price) {  return price * this.discount;} 老客戶:  function oldPrice() {    this.discount = 0.3;} oldPrice.prototype.getPrice = function(price) {    return price * this.discount;} 普通客戶  function Price() {    this.discount = 1;} Price.prototype.getPrice = function(price) {    return price ;} 2. 上下文:  function Context() {    this.name = '';    this.strategy = null;    this.price = 0;} Context.prototype.set = function(name, strategy, price) {    this.name = name;    this.strategy = strategy;    this.price = price;} Context.prototype.getResult = function() {    console.log(this.name + ' 的結賬價為: ' + this.stragegy.getPrice(this.price));} 3. 用戶端使用;  // 上下文var context = new Context(); //vip客戶var vip = new vipPrice();context.set ('vip客戶', vip, 200);context.getPrice(); //老客戶var old = new oldPrice();context.set ('老客戶', old, 200);context.getPrice(); //普通客戶//... 這樣即使得 客戶 與演算法解藕,又使得修改跟擴充能獨立的進行,不影到用戶端或其他演算法的使用; 其他說明 策略模式是一個非常實用跟常用的設計模式,普通用於商場價格,促銷等情境,他跟原廠模式很像,可以說是他的一種升級版本; 策略模式相關模式:原廠模式,組合模式;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.