策略模式

定义

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。

案例

1. 代码重构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
summaryList.map((item, index) => {
if (item.saasAttr === 'userAvatar') {
this.headImg = summaryList[index].value[0]
} else if (item.saasAttr === 'userName') {
this.headName = summaryList[index].value[0]
} else if (item.saasAttr === 'type') {
this.headType = summaryList[index].value[0]
} else if (item.saasAttr === 'memo') {
this.memo = summaryList[index].value[0]
} else if (item.saasAttr === 'images') {
this.imgList = summaryList[index].value[0]
} else if (item.saasAttr === 'communicateTime') {
this.communicateTime = summaryList[index].value[0]
} else if (item.saasAttr === 'communicateBusinessLinkText') {
this.communicateBusinessLinkText = summaryList[index].value[0]
} else if (item.saasAttr === 'customerNameLinkText') {
this.customerNameLinkText = summaryList[index].value[0]
} else if (item.saasAttr === 'contactNameLinkText') {
this.contactNameLinkText = summaryList[index].value[0]
} else if (item.saasAttr === 'address') {
this.address = summaryList[index].value[0]
this.addressExtra = summaryList[index].extra
} else if (item.saasAttr === 'video') {
this.videoData = summaryList[index].value[0]
}
})

上面代码大量使用了if...else...,可以使用策略模式重构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const relationsMap = {
userAvatar: 'headImg',
userName: 'headName',
type: 'headType',
images: 'imgList',
communicateTime,
communicateBusinessLinkText,
customerNameLinkText,
contactNameLinkText,
address,
memo,
video
}

summaryList.forEach((item, index) => {
relationsMap[item.saasAttr] && (this[relationsMap[item.saasAttr]] = item.value[0])
item.saasAttr === 'address' && (this.addressExtra = item.extra)
})

2. 使用策略模式计算奖金

1
2
3
4
5
6
7
8
9
10
11
12
// 定义薪资计算类
const Strategies = {
S: salary => salary * 4,
A: salary => salary * 3,
B: salary => salary * 2,
}

// 定义薪资计算方法调用薪资计算类
function calcBonus(level, salary) {
return Strategies[level](salary);
}
// 如果以后需要添加C级D级的计算只需要在Strategies类里添加C和D就可以了。可扩展性较好。
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • © 2019-2021 musi

请我喝杯咖啡吧~

支付宝
微信