实现功能
实现多个条件下的点击跳转
不使用策略模式
const changeDataFn = (type, val) => {
// emit.emit('realTimeChart', val)
if (realTimeSpeed.value && type == 'realTime' && val == 4) {
window.open(window.location.href + `speedRealtime`)
} else if (realTimeHeight.value && type == 'realTime' && val == 3) {
window.open(window.location.href + `heightRealtime`)
}
else if (replaySpeed.value && type == 'backup' && val == 2) {
window.open(window.location.href + `speedBackup`)
} else if (replayHeight.value && type == 'backup' && val == 1) {
window.open(window.location.href + `heightBackup`)
}
}
使用策略模式
const strategies = {
realTime: {
'3': () => {
if (realTimeHeight.value) {
window.open(window.location.href + `heightRealtime`)
}
},
'4': () => {
if (realTimeSpeed.value) {
window.open(window.location.href + `speedRealtime`)
}
},
},
backup: {
'1': () => {
if (replayHeight.value) {
window.open(window.location.href + `heightBackup`)
}
},
'2': () => {
if (replaySpeed.value) {
window.open(window.location.href + `speedBackup`)
}
},
},
}
const changeDataFn = (type, val) => {
const strategy = strategies[type]
if (strategy && strategy[val]) {
strategy[val]()
}
}
使用策略模式的优点
- 可扩展性:策略模式使得新增、修改或删除算法变得更加容易,因为每个策略都是独立的对象,可以按需添加或修改策略,而不需要修改已有的代码。
- 可维护性:将不同的算法逻辑分离封装,使得代码更易于理解、维护和测试。
- 可复用性:策略模式提供了一种可复用的方式来组织相关的算法,可以在不同的上下文中重用。
使用策略模式的缺点
- 增加了类的数量:每个策略都需要定义一个独立的类,当策略较多时,可能会增加类的数量,使得代码结构更加复杂。
- 客户端需要了解所有的策略:使用策略模式的客户端需要了解所有的策略,以正确地选择并使用合适的策略对象。
使用策略模式的场景
- 当一个系统需要支持多种算法或策略,并且这些算法或策略在运行时可被动态切换时,可以使用策略模式。
- 当一个问题有多种解决方案,并且每种解决方案都有不同的优缺点,可以使用策略模式来提供灵活的选择。
- 当需要避免使用大量的条件语句或者复杂的设计来处理不同的情况时,策略模式可以提供一种更清晰、可维护的解决方案。
总结
总的来说,策略模式适用于涉及算法或策略的场景,可以提高代码的可维护性和可扩展性,同时更好地组织和复用相关的算法或策略逻辑。