案例代码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