摘要:一個基于策略模式的程序至少由兩部分組成。優(yōu)點(diǎn)策略模式利用組合委托和多態(tài)等技術(shù)和思想,可以有效地避免多重條件選擇語句。在策略模式中利用組合和委托來讓擁有執(zhí)行算法的能力,這也是繼承的一種更輕便的替代方案。
一個基于策略模式的程序至少由兩部分組成。
第一個部分是一組策略類,策略類封裝了具體的算法,并負(fù)責(zé)具體的計算過程。第二個部分是環(huán)境類Context,Context接受客戶的請求,隨后把請求委托給某一個策略類。
優(yōu)點(diǎn):
策略模式利用組合、委托和多態(tài)等技術(shù)和思想,可以有效地避免多重條件選擇語句。
策略模式提供了對開放—封閉原則的完美支持,將算法封裝在獨(dú)立的strategy中,使得它們易于切換,易于理解,易于擴(kuò)展。
策略模式中的算法也可以復(fù)用在系統(tǒng)的其他地方,從而避免許多重復(fù)的復(fù)制粘貼工作。
在策略模式中利用組合和委托來讓Context擁有執(zhí)行算法的能力,這也是繼承的一種更輕便的替代方案。
缺點(diǎn):
首先,使用策略模式會在程序中增加許多策略類或者策略對象,但實際上這比把它們負(fù)責(zé)的邏輯堆砌在Context中要好。
其次,要使用策略模式,必須了解所有的strategy,必須了解各個strategy之間的不同點(diǎn),這樣才能選擇一個合適的strategy。比如,我們要選擇一種合適的旅游出行路線,必須先了解選擇飛機(jī)、火車、自行車等方案的細(xì)節(jié)。此時strategy要向客戶暴露它的所有實現(xiàn),這是違反最少知識原則的。
策略模塊:(環(huán)境類)
define(function () { "use strict"; var Validator = function () { }; Validator.prototype.selectValidator = function (validator) { this.validator = validator;//validator就是驗證函數(shù) return this; //this指向validator對象 }; Validator.prototype.validate = function (value) { if (this.validator) { return this.validator.validate(value);//this.validator驗證函數(shù) } throw ("No validator selected"); }; return Validator; });
郵箱驗證模塊(策略類)
define(function () { "use strict"; return { validate: function (value) { return value.indexOf("@") !== -1;//簡單的郵箱驗證 } }; });
號碼驗證模塊(策略類)
define(function () { "use strict"; return { validate: function (value) { return (/^[0-9]{11}$/g).test(value);//可以嚴(yán)謹(jǐn)些 } } });
init模塊
define(function (require) { "use strict"; return { init: function () { var Strategy = require("strategy/strategy"), telValidator = require("strategy/telValidator"), emailValidator = require("strategy/emailValidator"), validator; validator = new Strategy(); console.log(validator.selectValidator(telValidator).validate(012345678901)); console.log(validator.selectValidator(emailValidator).validate("test")); } }; });
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/78815.html
摘要:實際上在這種將函數(shù)作為一等對象的語言里,策略模式已經(jīng)融入到了語言本身當(dāng)中,我們經(jīng)常使用高階函數(shù)來封裝不同的行為,并且把它傳遞到另一個函數(shù)中。 聲明:這個系列為閱讀《JavaScript設(shè)計模式與開發(fā)實踐》 ----曾探@著一書的讀書筆記 1.策略模式的定義 將不變的部分和變化的部分隔開是每個設(shè)計模式的主題。 定義一系列的算法,把它們一個個封裝起來,并且使它們可以相互替換。 2.策略模式...
摘要:策略模式實現(xiàn)的也是類似的場景。第二個部分是環(huán)境類不變,接收客戶的請求,隨后把請求委托給某一個策略類。參考文章設(shè)計模式設(shè)計模式與開發(fā)實踐設(shè)計模式系統(tǒng)講解與應(yīng)用本文首發(fā),期待作者以樂之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVbugi7?w=800&h=600); 策略模式:定義一系列的算法,把它們一個個封裝起來,并且...
摘要:本系列為設(shè)計模式與開發(fā)實踐作者曾探學(xué)習(xí)總結(jié),如想深入了解,請支持作者原版策略模式策略模式的定義定義一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換。 本系列為《JavaScript設(shè)計模式與開發(fā)實踐》(作者:曾探)學(xué)習(xí)總結(jié),如想深入了解,請支持作者原版 策略模式 策略模式的定義:定義一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換。 舉個形象的例子,使用策略模式計算...
摘要:策略模式可以避免代碼中的多重判斷條件。策略模式在程序中或多或少的增加了策略類。此文僅記錄本人閱讀設(shè)計模式與開發(fā)實踐這個本時的感受,感謝作者曾探寫出這么好的一本書。設(shè)計模式中很重要的一點(diǎn)就是將不變和變分離出來。參考設(shè)計模式與開發(fā)實踐曾探 策略模式的定義是:定義一系列的算法,把它們一個個封裝起來,并且是它們可以相互替換。 策略模式可以避免代碼中的多重判斷條件。 策略模式很好的體現(xiàn)了開放-...
摘要:策略模式總結(jié)什么是策略模式策略模式的定義是定義一系列的算法,把他們獨(dú)立封裝起來,并且可以相互替換。策略模式的使用如果策略模式僅僅是用來封裝算法,可能有點(diǎn)小才大用了。原文鏈接設(shè)計模式策略模式上一篇設(shè)計模式單例模式 javascript策略模式總結(jié) 1.什么是策略模式? 策略模式的定義是:定義一系列的算法,把他們獨(dú)立封裝起來,并且可以相互替換。 例如我們需要寫一段代碼來計算員工的獎金。當(dāng)績...
摘要:策略模式總結(jié)什么是策略模式策略模式的定義是定義一系列的算法,把他們獨(dú)立封裝起來,并且可以相互替換。策略模式的使用如果策略模式僅僅是用來封裝算法,可能有點(diǎn)小才大用了。原文鏈接設(shè)計模式策略模式上一篇設(shè)計模式單例模式 javascript策略模式總結(jié) 1.什么是策略模式? 策略模式的定義是:定義一系列的算法,把他們獨(dú)立封裝起來,并且可以相互替換。 例如我們需要寫一段代碼來計算員工的獎金。當(dāng)績...
閱讀 2902·2023-04-26 02:14
閱讀 3751·2019-08-30 15:55
閱讀 1843·2019-08-29 16:42
閱讀 2757·2019-08-26 11:55
閱讀 2846·2019-08-23 13:38
閱讀 480·2019-08-23 12:10
閱讀 1308·2019-08-23 11:44
閱讀 2790·2019-08-23 11:43