js設計模式 策略模式

2022-09-05 18:48:12 字數 3848 閱讀 7230

策略模式的定義是:定義一系列的演算法,把它們乙個個封裝起來,並且使它們可以相互替換。

策略模式指的是定義一系列的演算法,把它們乙個個封裝起來。將不變的部分和變化的部分隔開是每個設計模式的主題,策略模式也不例外,策略模式的目的就是將演算法的使用與演算法的實現分離開來。

乙個基於策略模式的程式至少由兩部分組成。第乙個部分是一組策略類,策略類封裝了具體 的演算法,並負責具體的計算過程。 第二個部分是環境類context,context 接受客戶的請求,隨後 把請求委託給某乙個策略類。要做到這點,說明 context中要維持對某個策略物件的引用。

策略模式的實現並不複雜,關鍵是如何從策略模式的實現背後,找到封裝變化、委託和多型性這些思想的價值。

從定義上看,策略模式就是用來封裝演算法的。但如果把策略模式僅僅用來封裝演算法,未免有一點大材小用。在實際開發中,我們通常會把演算法的含義擴散開來,使策略模式也可以用來封裝 一系列的「業務規則」。只要這些業務規則指向的目標一致,並且可以被替換使用,我們就可以 用策略模式來封裝它們。

但這些缺點並不嚴重

var calculatebonus = function

( performancelevel, salary )

if ( performancelevel === 'a')

if ( performancelevel === 'b')

};calculatebonus( 'b', 20000 ); //

輸出:40000

calculatebonus( 's', 6000 ); //

輸出:24000

缺點:calculatebonus 函式比較龐大,包含了很多 if-else 語句

calculatebonus 函式缺乏彈性,如果增加了一種新的績效等級 c,或者想把績效 s 的獎金 係數改為 5,那我們必須深入 calculatebonus 函式的內部實現,這是違反開放封閉原則的。

演算法的復用性差

var performances = function

( salary );

var performancea = function

( salary );

var performanceb = function

( salary );

var calculatebonus = function

( performancelevel, salary )

if ( performancelevel === 'a')

if ( performancelevel === 'b')

};calculatebonus( 'a' , 10000 ); //

輸出:30000

問題依然存在:calculatebonus 函式有可能越來越龐大,而且在系統變化的時候缺乏彈性

var performances = function

(){};

performances.prototype.calculate = function

( salary );

var performancea = function

(){};

performancea.prototype.calculate = function

( salary );

var performanceb = function

(){};

performanceb.prototype.calculate = function

( salary );

//接下來定義獎金類bonus:

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

但這段**是基於傳統物件導向語言的模仿,下面我們用j**ascript實現的策略模式。

在 j**ascript 語言中,函式也是物件,所以更簡單和直接的做法是把 strategy 直接定義為函式

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

var performances = function

() {};

performances.prototype.calculate = function

(salary) ;

var performancea = function

() {};

performancea.prototype.calculate = function

(salary) ;

var performanceb = function

() {};

performanceb.prototype.calculate = function

(salary) ;

//接下來定義獎金類bonus:

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

首先緩動演算法的職責是實現小球如何運動

然後動畫類(即context)的職責是負責:

初始化動畫物件

在運動開始之前,需要提前記錄一些有用的資訊,至少包括以下資訊:

計算小球某時刻的位置

更新小球的位置

我是div

缺點:一 個文字輸入框只能對應一種校驗規則

JS 設計模式 策略模式

策略模式指的是定義一系列的演算法,把它們乙個個封裝起來。將不變的部分和變化的部分隔開是每個設計模式的主題,策略模式也不例外,策略模式的目的就是將演算法的使用與演算法的實現分離開來。可以很好的替換if else混亂的 var strategies a function salary b functio...

JS設計模式 策略模式

乙個根據等級計算獎金的例子。var stratagies a function salary b function salary var calculatebonus function level,salary console.log calculatebonus s 20000 console.l...

js 設計模式 策略模式

定義 將定義的一組演算法封裝起來,使其相互之間可以替換。封裝的演算法具有一定的獨立性,不會隨客戶端的變化而變化 廢話不多說,先來個例子 例如要寫乙個計算兩個數加減乘除的方法,會有人這麼寫 countnum type,num1,num2 else if type subtract else if ty...