定义:
意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
何时使用:代码中包含大量与对象状态有关的条件语句。
状态模式在游戏设计里非常常见,比如说一个玩家,体力值不同,拥有不同的行为,精力充沛的时候,可以打出高的输出,防御也很有效;体力低时,输出很低,并且防御能力下降。
代码:
// 玩家的行为接口
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]: 反应迟钝,颤颤巍巍,毫无招架之力~
网友评论