案例代碼1,公司促銷活動,返優惠券:算法
const order = (orderType,pay,stock) { if(orderType === 1){ if(pay === true){ console.log('500元定金,返回100優惠券') } else { if(stock > 0 ){ consle.log('普通購買,無優惠券') } else { console.log('庫存不足') } } } else if(orderType === 2){ if(pay === true){ console.log('200元定金,返回50優惠券') } else { if(stock > 0 ){ consle.log('普通購買,無優惠券') } else { console.log('庫存不足') } } } else { if(stock > 0 ){ consle.log('普通購買,無優惠券') } else { console.log('庫存不足') } }}複製代碼
// 模式封裝,具體處理者const order500 = function(orderType,pay,stock){ if(orderType === 1 && pay === true){ console.log('500元定金,返回100優惠券') } else { return 'nextSuccessor'; }}const order200 = function(orderType,pay,stock){ if(orderType === 2 && pay === true){ console.log('200元定金,返回50優惠券') } else { return 'nextSuccessor'; }}const orderNormal = function(orderType,pay,stock){ if(stock > 0 ){ console.log('普通購買,無優惠券') } else { console.log('庫存不足') }}// 原型鏈,鏈式傳遞,抽象處理者const Chain = function(fn){ this.fn = fn; this.successor = null;}Chain.prototype.setNextSuccessor = function(successor){ return this.successor = successor;}Chain.prototype.passRequest = function(){ let ret = this.fn.apply(this, arguments); if(ret === 'nextSuccessor'){ return this.successor && this.successor.passRequest.apply(this.successor, arguments); } return ret;}// 組裝責任鏈let chainOrder500 = new Chain(order500);let chainOrder200 = new Chain(order200);let chainOrderNormal = new Chain(orderNormal);chainOrder500.setNextSuccessor(chainOrder200);chainOrder200.setNextSuccessor(chainOrderNormal);// 調用chainOrder500.passRequest(1,false,0);chainOrder500.passRequest(1,true,10);chainOrder500.passRequest(2,true,11);chainOrder500.passRequest(2,false,1);複製代碼
職責鏈模式關係圖bash
職責鏈模式總結app
主要構成者:函數
案例代碼2,產品促銷,按用戶等級返現:學習
return30(price) { // 返現30 do something}retuen50(price) { // do something}switch(user.cheaperLevel) { case 1: return30() break case 2: return50() break ...}// 函數全局暴露,不能根據不一樣狀況去使用想要的方法複製代碼
策略模式設計重構ui
const PriceStrategy = function(){// 內部算法對象, 具體策略類 const stragtegy = { return30: function(price){ }, return60: function(price){ }, }// 策略算法調用接口,抽象策略類 return function(cheaperLevel,price) { return stragtegy[cheaperLevel] && stragtegy[cheaperLevel](price) }}// 使用方式,環境類let price = PriceStrategy('return30','321.56')console.log(price)複製代碼
案例代碼3,表單驗證,策略模式重構:this
const inputStrategy = () => { const strategy = { notNull : (val) => { return /\s+/.test(val) ? '請輸入' : ''; }, number :(val) => { return val.isNaN ? '請輸入數字' :''; } } return { check:(type,value)=>{ return strategy[type](value) ; }, // 確定策略不夠用,爲它添加一個自定義的策略Api addStrategy:(type,fn)=>{ strategy[type] = fn ; } }}// 算法調用let inputValue = document.getElmentById('target')let isVaild = inputStrategy.check('number',inputValue)複製代碼
策略模式總結spa