前置文章: 设计模式的原则
其他设计模式:用心理解设计模式
设计模式相关代码已统一放至 我的 Github
一、定义
行为型模式之一。
Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
(允许对象在其内部状态发生变化时改变其行为。看起来就像是这个对象的类发生了改变一样。)
二、结构解析
状态模式的一般结构有四种角色: 环境/上下文、抽象状态、具体状态。
环境/上下文(Context):拥有一系列内部状态,并持有一个具体状态为当前状态(状态可切换),拥有一个抽象方法接口,该接口在内部状态不同时,表现出不同的行为。
抽象状态(State):定义一个统一的接口,用来实际处理 “环境/上下文” 的各种状态对应的不同行为。
具体状态(ConcreteState):继承抽象状态并实现其接口。
三、评价
状态模式,解决了每次新增状态时都得修改环境类的问题。使其满足开闭原则。
它的核心思想是 “环境类的接口,反调各内部状态类自备的处理方法”。请参考 消除程序中的 if else(二),实际就是使用了 策略模式。
从客户的角度看,状态模式让环境的同一接口在改变其内部状态后,产生了不同的行为。
状态模式常用于简单的游戏AI。
四、实现
using UnityEngine;
namespace State
{
//抽象状态
public abstract class State
{
public abstract void Handle(Context context);
}
//具体状态A
public class ConcreteStateA : State
{
public override void Handle(Context context)
{
Debug.Log("状态为A时的处理方法");
}
}
//具体状态B
public class ConcreteStateB : State
{
public override void Handle(Context context)
{
Debug.Log("状态为B时的处理方法");
}
}
//环境/上下文
public class Context
{
private State currentSate;
public Context(State initSate)
{
currentSate = initSate;
}
public void Request()
{
this.currentSate.Handle(this);
}
public void SwitchSate(State newSate)
{
this.currentSate = newSate;
}
}
public class Client
{
static public void Main()
{
State stateA = new ConcreteStateA();
State stateB = new ConcreteStateB();
Context context = new Context(stateA);
context.Request(); //表现状态A的行为
context.SwitchSate(stateB);
context.Request(); //表现状态B的行为
}
}
}