1. 程式人生 > >第5章 策略模式

第5章 策略模式

第二部分 設計模式

第5章 策略模式

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

其實就是定義一系列的演算法,把他們各自封裝成策略類,演算法被封裝在策略類內部的方法裡。在對Context發起請求的時候,Context總是把請求委託給這些策略物件中間的某一個進行計算。

5.1 使用策略模式計算獎金

	/**
	 * 使用策略模式計算獎金
	 * S 4個月獎金
	 * A 3個月獎金
	 * B 2個月獎金
	 */
	
	//1、最原始實現方式
	//缺點:
	//(1)calculate函式比較龐大,包含了很多判斷語句,這些語句必須包含所有的邏輯分支
	//(2)函式缺乏彈性,如果增加了新的績效等級,或者想把績效等級的獎金係數修改一下,我們必須深入calculate函式內部實
	//現違反了開放-封閉原則
	//演算法的複用性差,如果在程式的其它地方用到這些演算法,我們只能複製粘帖
	var calculateBonus = function(performanceLevel, salary){
		switch(performanceLevel){
			case 'S':
			return salary*4
			break
			case 'A':
			return salary*3
			break
			case 'B':
			return salary*2
			break
			default:
			return salary
			break
		}
	}
	console.log(calculateBonus('A',10000))

 

  

	//2、使用組合函式重構程式碼
	//優點:(1)把各種演算法封裝到一個個的小函式裡,可以一目瞭然的知道對應的哪種演算法
	//(2)複用性強
	//缺點:calculateBouns函式會越來越龐大,在系統變化的時候缺乏彈性
	var performanceS = function(salary){
		return salary*4
	}
	var performanceA = function(salary){
		return salary*3
	}
	var performanceB = function(salary){
		return salary*2
	}

	var calculateBonus = function(performanceLevel, salary){
		switch(performanceLevel){
			case 'S':
			return performanceS(salary)
			break
			case 'A':
			return performanceA(salary)
			break
			case 'B':
			return performanceB(salary)
			break
		}
	}
	console.log(calculateBonus('B',10000))