JavaScript設(shè)計(jì)模式之策略模式詳解
在程序設(shè)計(jì)中,我們也常常遇到這種情況,要實(shí)現(xiàn)某一個(gè)功能我們有很多種算法可以實(shí)現(xiàn)。
這些算法靈活多樣,而且可以隨意互相替換。這種解決方案就是所謂的策略模式。
策略模式的定義是:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可以相互替換。
/*
* pre:策略模式
* 示例:公司計(jì)算獎(jiǎng)金,分A、B、C 三種績(jī)效,計(jì)算方式如下
* 績(jī)效為A,獎(jiǎng)金乘以系數(shù)5
* 績(jī)效為B,獎(jiǎng)金乘以系數(shù)4
* 績(jī)效為C,獎(jiǎng)金乘以系數(shù)3
*/
//-------- 示例1 ----------
var calculateBonus = function(performanceLevel, salary) {
if(performanceLevel === 'A') {
return salary * 5;
}
if(performanceLevel === 'B') {
return salary * 4;
}
if(performanceLevel === 'C') {
return salary * 3;
}
};
console.log(calculateBonus('A', 2000));
/*
缺點(diǎn):1、函數(shù)體系龐大,擁有太多的if-else語(yǔ)句;
2、如果增加績(jī)效D,需修改內(nèi)部函數(shù),違背封閉-開放原則;
3、復(fù)用性差,其他地方如果用到計(jì)算獎(jiǎng)金,只能賦值黏貼;
*/
//--------- 示例2 ------------
var performanceA = function(salary) {
return salary * 5;
};
var performanceB = function(salary) {
return salary * 4;
};
var performanceC = function(salary) {
return salary * 3;
};
var calculateBonus = function(performanceLevel, salary) {
if(performanceLevel === 'A') {
return performanceA(salary);
}
if(performanceLevel === 'B') {
return performanceB(salary);
}
if(performanceLevel === 'C') {
return performanceC(salary);
}
};
console.log(calculateBonus('A', 2000));
/*
缺點(diǎn):1、函數(shù)體系龐大,系統(tǒng)變化時(shí)缺乏彈性
*/
//--------- 示例3 ------------
// 策略模式重構(gòu):定義一系列算法,將它們一個(gè)個(gè)封裝起來(lái)。
var performanceA = function(){};
performanceA.prototype.caculate = function(salary){
return salary * 5;
};
var performanceB = function(){};
performanceB.prototype.caculate = function(salary){
return salary * 4;
};
var performanceC = function(){};
performanceC.prototype.caculate = function(salary){
return salary * 3;
};
var Bonus = function(){
this.salary = null;
this.strategy = null;
};
Bonus.prototype.setSalary = function(salary){
this.salary = salary;
};
Bonus.prototype.setStrategy = function(strategy){
this.strategy = strategy;
}
Bonus.prototype.getBonus = function(){
return this.strategy.caculate(this.salary);
}
var bonus = new Bonus();
bonus.setSalary(2000);
bonus.setStrategy(new performanceA());
console.log(bonus.getBonus());
// ----------- 示例4 ---------------
// javaScript版本
var Strategies = {
"A":function(salary){
return salary * 5;
},
"B":function(salary){
return salary * 4;
},
"C":function(salary){
return salary * 3;
}
};
var caculateBonus = function(level,salary){
return Strategies[level](salary);
};
console.log(caculateBonus("A",2000));
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js單例模式的兩種方案
- JS實(shí)現(xiàn)單例模式的6種方案匯總
- javascript 單例模式演示代碼 javascript面向?qū)ο缶幊?/a>
- JavaScript的單例模式 (singleton in Javascript)
- 輕松掌握J(rèn)avaScript單例模式
- [js高手之路]單例模式實(shí)現(xiàn)模態(tài)框的示例
- javascript設(shè)計(jì)模式--策略模式之輸入驗(yàn)證
- JavaScript設(shè)計(jì)模式之策略模式實(shí)例
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式之策略模式
- 學(xué)習(xí)JavaScript設(shè)計(jì)模式(策略模式)
- javascript單例模式與策略模式實(shí)例詳解
相關(guān)文章
解決JS使用fill()進(jìn)行數(shù)組填充遇到的問題
最近在做算法題時(shí),遇到需要?jiǎng)?chuàng)建二維數(shù)組并進(jìn)行初始化的情況,剛開始我使用的是 new Array(n).fill(new Array(n).fill('.')) 進(jìn)行二維數(shù)組的初始化,但無(wú)論怎樣我都通不過(guò)測(cè)試用例,所以本文就給大家詳細(xì)的介紹了如何解決這類問題以及將js中的fill(方法重學(xué)一下2023-09-09
JavaScript優(yōu)化專題之Loading and Execution加載和運(yùn)行
這篇文章主要介紹了JavaScript優(yōu)化專題中Loading and Execution加載和運(yùn)行的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
淺談js基礎(chǔ)數(shù)據(jù)類型和引用類型,深淺拷貝問題,以及內(nèi)存分配問題
下面小編就為大家?guī)?lái)一篇淺談js基礎(chǔ)數(shù)據(jù)類型和引用類型,深淺拷貝問題,以及內(nèi)存分配問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
使用JS實(shí)現(xiàn)圖片展示瀑布流效果(簡(jiǎn)單實(shí)例)
下面小編就為大家?guī)?lái)一篇使用JS實(shí)現(xiàn)圖片展示瀑布流效果(簡(jiǎn)單實(shí)例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09

