美文网首页
《设计模式》之状态模式

《设计模式》之状态模式

作者: 魅猫之 | 来源:发表于2020-06-13 14:03 被阅读0次

    定义:

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

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

    代码:

    // 玩家的行为接口
    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]: 反应迟钝,颤颤巍巍,毫无招架之力~ 
    

    相关文章

      网友评论

          本文标题:《设计模式》之状态模式

          本文链接:https://www.haomeiwen.com/subject/bhwatktx.html