《设计模式》之策略模式

定义

策略模式:定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

策略模式的核心的“策略”两个字,什么是策略呢,我的理解是策略是可以随时更换的,这样操作可以很灵活,比如我在玩CS的时候(假设我身上已经拥有很多武器了):

  1. 如果敌人在远处,那我就使用阻击枪瞄准,一枪爆头!
  2. 如果敌人在迅速靠近,那我就切换AK,一顿扫射!
  3. 如果敌人已经到了身边,用枪是很难瞄准,那我就切换小刀,一顿乱砍!

写一个武器的接口,所有武器都需要实现这个接口:

// 武器接口
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]: 使用小刀一顿乱砍! 

原则:

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,不针对实现编程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。