《设计模式》之状态模式

定义:

意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
何时使用:代码中包含大量与对象状态有关的条件语句。

状态模式在游戏设计里非常常见,比如说一个玩家,体力值不同,拥有不同的行为,精力充沛的时候,可以打出高的输出,防御也很有效;体力低时,输出很低,并且防御能力下降。

代码:

// 玩家的行为接口
interface IStateBehavior {
    attack: () => void,
    defence: () => void,
}

// 元气满满的状态
class FullEnergyStateBehavior implements IStateBehavior {

    public attack() {
        console.log('精力充沛,发动致命一击!')
    }

    public defence() {
        console.log('全力防御,毫发无伤!')
    }

}

// 疲惫不堪的状态
class TiredStateBehavior implements IStateBehavior {

    public attack() {
        console.log('毫无力气,挠痒痒~')
    }

    public defence() {
        console.log('反应迟钝,颤颤巍巍,毫无招架之力~')
    }

}

// 玩家
class Player {

    private HP: number
    
    public stateBehavior: IStateBehavior
    
    constructor() {
        this.HP = 100
        this.stateBehavior = new FullEnergyStateBehavior()
    }

    public setHP(hp: number) {
        this.HP = hp
        if (this.HP > 70) {
            this.stateBehavior = new FullEnergyStateBehavior()
            console.log('当前状态为精力充沛')
        } else {
            this.stateBehavior = new TiredStateBehavior()
            console.log('当前状态为疲惫不堪')
        }
    }
}

// 初始化精力充沛的玩家
const player = new Player()
player.setHP(100)
player.stateBehavior.attack()
player.stateBehavior.defence()

// 玩家受到攻击,HP剩余60
player.setHP(60)
player.stateBehavior.attack()
player.stateBehavior.defence()

输出结果:

[LOG]: 当前状态为精力充沛 
[LOG]: 精力充沛,发动致命一击! 
[LOG]: 全力防御,毫发无伤! 
[LOG]: 当前状态为疲惫不堪 
[LOG]: 毫无力气,挠痒痒~ 
[LOG]: 反应迟钝,颤颤巍巍,毫无招架之力~ 

你可能感兴趣的:(《设计模式》之状态模式)