定義:
意圖:允許對象在內部狀態(tài)發(fā)生改變時改變它的行為栖榨,對象看起來好像修改了它的類蜡娶。
主要解決:對象的行為依賴于它的狀態(tài)(屬性)错洁,并且可以根據它的狀態(tài)改變而改變它的相關行為。
何時使用:代碼中包含大量與對象狀態(tài)有關的條件語句隆豹。
狀態(tài)模式在游戲設計里非常常見,比如說一個玩家茅逮,體力值不同璃赡,擁有不同的行為判哥,精力充沛的時候,可以打出高的輸出碉考,防御也很有效塌计;體力低時,輸出很低侯谁,并且防御能力下降锌仅。
代碼:
// 玩家的行為接口
interface IStateBehavior {
attack: () => void,
defence: () => void,
}
// 元氣滿滿的狀態(tài)
class FullEnergyStateBehavior implements IStateBehavior {
public attack() {
console.log('精力充沛,發(fā)動致命一擊墙贱!')
}
public defence() {
console.log('全力防御热芹,毫發(fā)無傷!')
}
}
// 疲憊不堪的狀態(tài)
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('當前狀態(tài)為精力充沛')
} else {
this.stateBehavior = new TiredStateBehavior()
console.log('當前狀態(tài)為疲憊不堪')
}
}
}
// 初始化精力充沛的玩家
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]: 當前狀態(tài)為精力充沛
[LOG]: 精力充沛报腔,發(fā)動致命一擊!
[LOG]: 全力防御剖淀,毫發(fā)無傷纯蛾!
[LOG]: 當前狀態(tài)為疲憊不堪
[LOG]: 毫無力氣,撓癢癢~
[LOG]: 反應遲鈍祷蝌,顫顫巍巍茅撞,毫無招架之力~