策略模式的定義:算法
將算法一個個的單獨進行封裝,而且使他們能夠相互替換。此模式讓算法的變化不會影響到使用算法的客戶。this
先回顧一下,咱們在作項目的過程當中,是否是常常會碰見由於業務邏輯的關係,咱們會寫好多的is-else語句進行判斷,或者使用switch語句,在後期添加新的需求的時候,比較頭疼的須要去改這些判斷語句,並且有時候會,添加一條判斷語句,一不當心會致使全部的判斷都失效呢?舉一個以前項目中用到的例子把,簡化一下。有一個按鈕在不一樣的條件下,跳轉到不一樣的頁面,以下:url
toseeHouse() { switch(this.activeIndex){ case 0:uni.navigateTo({ url: '/0' }); break; case 1:uni.navigateTo({ url: '/1' }); break; case 2:uni.navigateTo({ url: '/2' }); break; case 3:uni.navigateTo({ url: '/3' }); break; } },
這段代碼帶來的問題主要是在增長新的需求的時候,咱們還須要修改這段代碼的總體邏輯。spa
而後根據策略模式,咱們將一系列的算法單獨封裝出去,使用哪一個,調用哪一個方法。prototype
JavaScript版本的策略模式設計
let obj = { '0': function() { return '0' }, '1': function() { return '1' }, '2': function() { return '2' } } console.log('111111111', obj['0']()) //0
這樣,就避免了if-else 語句的判斷,若是增長了新的業務邏輯,咱們能夠直接修改算法,而不會影響用戶的使用。code
使用策略模式重構代碼,能夠消除程序中大片的條件分支語句。在實際開發的過程當中,咱們一般會把算法的含義擴散開來,是策略模式也能夠封裝一系列的「業務規則」。只要這些業務規則的指向的目標一致,而且能夠被替換使用,咱們就可使用策略模式來封裝他們。orm
在舉一個在網上看到的例子,應該算是比較經典的把,由於 好多博客中都以這個例子爲例,就是計算獎金的這個例子。對象
傳統版的策略模式:blog
var performanceA = function() { } performanceA.prototype.calculate = function(salary) { return salary*4; } var performanceB = function() {} performanceB.prototype.calculate = function(salary) { return salary*3 } var performanceC = function() {} performanceC.prototype.calculate = function(salary) { return salary*2 } //獎金類 var Bouns = function() { this.salary = null; //原始工資 this.levelObj = null; //績效等級對應的策略模式 } Bouns.prototype.setSalary = function(salary) { // 保存員工的原始工資 this.salary = salary; } Bouns.prototype.setlevelObj = function(levelObj) { // 設置員工績效等級對應的策略模式 this.levelObj = levelObj; } Bouns.prototype.getBouns = function() { // 把計算獎金的操做委託給對應的策略對象 return this.levelObj.calculate(this.salary) } var bouns = new Bouns(); bouns.setSalary(1000); bouns.setlevelObj(new performanceA()); console.log(bouns.getBouns()) // 4000 bouns.setlevelObj(new performanceB()) console.log(bouns.getBouns()) // 3000
策略模式 應該至少由兩部分組成,一部分使策略類,就是裏面封裝了具體的算法。而且負責具體的計算過程。第二個部門就是環境類Context。該Contex接收客戶的請求,而後把請求委託給符合要求的某一個策略類。
策略模式的優勢:
優勢:
- 避免使用大量的if-else語句,使代碼塊簡潔,易讀。
- 符合設計原則中的開放-封閉原則,面向擴展開放,面向修改關閉。
- 複用性高
缺點:
- 增長了許多策略類或者策略對象
總結:
策略模式定義了一系列的算法,從概念上講,全部的這些算法都是作相同的事情,只是實現不一樣,他能夠以相同的方式調用全部的方法,減小了各類算法類與使用算法類之間的耦合。