定义
策略模式:定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
策略模式的核心的“策略”两个字,什么是策略呢,我的理解是策略是可以随时更换的,这样操作可以很灵活,比如我在玩CS的时候(假设我身上已经拥有很多武器了):
- 如果敌人在远处,那我就使用阻击枪瞄准,一枪爆头!
- 如果敌人在迅速靠近,那我就切换AK,一顿扫射!
- 如果敌人已经到了身边,用枪是很难瞄准,那我就切换小刀,一顿乱砍!
写一个武器的接口,所有武器都需要实现这个接口:
// 武器接口
interface IWeapon {
fire(): void,
description(): string,
}
阻击枪的实现
// 阻击枪
class Sniper implements IWeapon {
fire() {
console.log(`使用${this.description()}一枪爆头!`)
}
description(): string {
return '阻击枪'
}
}
AK的实现
// AK
class AK implements IWeapon {
fire() {
console.log(`使用${this.description()}一顿扫射!`)
}
description(): string {
return 'AK'
}
}
小刀的实现
// 小刀
class Knife implements IWeapon {
fire() {
console.log(`使用${this.description()}一顿乱砍!`)
}
description(): string {
return '小刀'
}
}
三种武器都实现了IWeapon接口,现在写一个玩家类
// 玩家
class Player {
weapon?: IWeapon
setWeapon(weapon: IWeapon) {
this.weapon = weapon
console.log(`切换武器:${weapon.description()}`)
}
fire() {
this.weapon?.fire()
}
}
使用方式:
// 拥有的武器
const sniper: IWeapon = new Sniper()
const ak: IWeapon = new AK()
const knife: IWeapon = new Knife()
// 一个玩家
const p = new Player()
// 如果敌人在远处,那我就使用阻击枪瞄准,一枪爆头!
p.setWeapon(sniper)
p.fire()
// 如果敌人在迅速靠近,那我就切换AK,一顿扫射!
p.setWeapon(ak)
p.fire()
// 如果敌人已经到了身边,用枪是很难瞄准,那我就切换小刀,一顿乱砍!
p.setWeapon(knife)
p.fire()
输出结果:
[LOG]: 切换武器:阻击枪
[LOG]: 使用阻击枪一枪爆头!
[LOG]: 切换武器:AK
[LOG]: 使用AK一顿扫射!
[LOG]: 切换武器:小刀
[LOG]: 使用小刀一顿乱砍!
原则:
- 封装变化
- 多用组合,少用继承
- 针对接口编程,不针对实现编程
网友评论