設計模式之策略模式

2022-09-19 05:18:14 字數 3124 閱讀 4424

策略模式說白了就是要實現某乙個功能,有多種方案可以選擇。我們定義一系列的演算法,把它們乙個個封裝起來,並且使它們可以相互轉換。

既然提到具體的功能,那只能通過開發常遇到的一些案例去解讀策略模式

比如我們要給乙個公司開發乙個年終獎發獎勵的功能:

當績效型別為「s」時,4個月的獎金

當績效型別為「a」時,3個月獎金

當績效型別為「b」時,2個月獎金

//我們很容易就想到用performancelevel, salary分別代表績效等級和基本月工資。然後大致的**如下

var calculatebonus = function(performancelevel, salary)

if (performancelevel === 'a')

if (performancelevel === 'b')

};console.log(calculatebonus('b', 20000)); // 輸出:40000

console.log(calculatebonus('s', 6000)); // 輸出:24000

// 一看沒問題吧,功能都實現了,if-else俠有下面兩個缺點

calculatebonus 函式既進行了等級判斷,又返回了績效獎金,違背了函式的「單一功能」原則'

不僅如此,它還違背了「開放封閉」原則,假設哪一天老闆又要加個sss級績效給自己秘書咋辦,咱不得改動這個主體函式。

根據上面的問題,結合我們學習的設計模式去改造函式

var performances = function(salary) ;

var performancea = function(salary) ;

var performanceb = function(salary) ;

var calculatebonus = function(performancelevel, salary)

if (performancelevel === 'a')

if (performancelevel === 'b')

};

再思考一下,我們是遵循了單一功能原則,但是每次新增乙個performancelevel時,我們還是要去改calculatebonus 這個函式,現在我們的需求是

s---> salary * 4

a---> salary * 3

b---> salary * 2

這麼一想,我們是不是很容易就想到了對映關係,那麼常用的對映不就是物件的鍵值對嘛

var strategies = ,

a: function(salary) ,

b: function(salary)

};var calculatebonus = function(level, salary) ;

console.log(calculatebonus('s', 20000)); // 輸出:80000

console.log(calculatebonus('a', 10000)); // 輸出:30000

這樣我們再也不用擔心老闆要給多少個秘書新增績效了

strategies['sss'] = function(salary) 

...

我們也可以直接用重構**

var performances = function (){}

performances.prototype.calculate = function(salary);

var performancea = function (){}

performances.prototype.calculate = function(salary);

var performanceb = function (){}

performances.prototype.calculate = function(salary);

var bonus = function();

bonus.prototype.setsalary = function( salary );

bonus.prototype.setstrategy = function( strategy );

bonus.prototype.getbonus = function();

var bonus = new bonus();

bonus.setsalary( 10000 );

bonus.setstrategy( new performances() ); // 設定策略物件

console.log( bonus.getbonus() ); // 輸出:40000

bonus.setstrategy( new performancea() ); // 設定策略物件

console.log( bonus.getbonus() ); // 輸出:30000

下面順便附上es6 class的寫法

// 定義策略類

class performances

}class performancea

}class performanceb

}// 定義獎金類

class bonus

// 設定原始工資

setsalary(salary)

// 設定員工績效等級對應的策略物件

setstrategy(strategy)

getbonus()

}var bonus = new bonus();

bonus.setsalary(10000);

bonus.setstrategy(new performances()); // 設定策略物件

console.log(bonus.getbonus()); // 輸出:40000

bonus.setstrategy(new performancea()); // 設定策略物件

console.log(bonus.getbonus()); // 輸出:30000

下面我們實現乙個form表單提交的多條件校驗的例子

設計模式之策略模式

include using namespace std 飛行行為介面類 class flystrategy 高空飛行行為具現類 class heightfly public flystrategy virtual void fly private heightfly 低空飛行行為具現類 class ...

設計模式之 策略模式

策略模式 strategy pattern 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。策略模式是一種定義了一系列演算法的方法,從概念上來看,所以得這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各...

設計模式之策略模式

何為策略,就是可以實現目標的方案集合。而完成一項任務有不同的方式,每一種方式稱為乙個策略。策略模式就是定義一系列演算法,將每乙個演算法封裝起來,並讓他們可以相互替換。很簡單的乙個例子 年底移動公司推出很多的活動,比如說 存話費贈食用油,交話費贈話費,買手機贈話費 等等。推出這些個活動目的就只有乙個,...