js 策略模式
需求
有一个请款单列表需要查看详情, 但是每一个请款单的类型都可能是不同的, 不同的请款单需要做不同的操作
实现
先定义一个Detail
map作为一个参数中转
将传入的参数经过一定的规则映射之后变成具体的方法名称
我这里的参数简单只做了简单的处理,如果业务逻辑更简单也可以直接把方法名称作为参数传入
拿到具体的方法名称之后,就可以把方法名称作为strategies的key调用这个方法了
Detail
map方法:Detail的私有方法,外部不可调用。用于适应外部的各种参数,最终返回strategies对象的key
strategies对象:Detail的私有对象,外部不可调用。存储着实际执行的方法,key为方法名称
checkDetail方法:Detail的对外开放的方法,new Detail()之后方可调用
type参数:Detail的参数,是map方法的参数,如果不传,会有一个默认值
function Detail(type) {
//映射,将传入的参数映射成对应的方法名
var map = function (innerType) {
return {
'A请款': 'aPay',
'B请款': 'bPay',
'C请款': 'cPay',
'暂无详情': 'noDetail'
}[innerType ? innerType : type];
}
//具体的查看请款详情的方法集合
var strategies = {
aPay() {
alert('A...');
},
bPay() {
alert('B...');
},
cPay() {
alert('C...');
},
noDetail() {
alert('暂无详情');
}
}
//Detail对象对外开放的方法,根据映射调用具体的方法
//new Detail 时候如果给Detail传入了参数,调用map()后会使用这个参数
this.checkDetail = function () {
strategies[map()] ? strategies[map()]() : strategies[map('暂无详情')]();
}
}
调用
new Detail().checkDetail(); //alert('暂无详情')
new Detail('A请款').checkDetail(); //alert('A...');
——完——