- 概述
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 - 解决的问题
主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。 -
模式中的角色
3.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
3.2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
3.3 具体状态(Concrete State):实现抽象状态定义的接口。
<meta charset="utf-8">
基础框架实现代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// 设计模式之状态模式
///具体实现类
public class StateDesignMode : MonoBehaviour
{
private void Start()
{
///实例化关联类
Context context = new Context();
//设置默认状态类
context.setState(new ConcreteStateA(context));
//A状态实现handle
context.Handle(5);
//A状态先实现handle 然后内部自行转换到B状态
context.Handle(20);
//B状态实现handle
context.Handle(30);
//B状态先实现handle 然后内部自行转换到A状态
context.Handle(6);
//A状态实现handle
context.Handle(4);
}
}
/// <summary>
/// 状态之间的关联类
/// </summary>
public class Context
{
private IState mState;
/// <summary>
/// 设置当前的状态
/// </summary>
public void setState(IState state)
{
mState = state;
}
/// <summary>
/// 实现状态的handle方法
/// </summary>
/// <param name="args"></param>
public void Handle(int args)
{
mState.Handle(args);
}
}
/// <summary>
/// 状态接口
/// </summary>
public interface IState
{
/// <summary>
/// 具体实现方法
/// </summary>
/// <param name="args"></param>
void Handle(int args);
}
/// <summary>
/// 具体实现状态类A
/// </summary>
public class ConcreteStateA : IState
{
/// <summary>
/// 需要声明当前状态的拥有者
/// </summary>
private Context mContex;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="contex"></param>
public ConcreteStateA(Context contex)
{
mContex = contex;
}
public void Handle(int args)
{
//A状态的逻辑处理
Debug.Log("状态A.Handle"+args);
//A状态切换到B状态下的条件
if (args > 10)
{
//切换B状态
mContex.setState(new ConcreteStateB(mContex));
}
}
}
/// <summary>
/// 具体实现状态类B
/// </summary>
public class ConcreteStateB : IState
{
/// <summary>
/// 需要声明当前状态的拥有者
/// </summary>
private Context mContex;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="contex"></param>
public ConcreteStateB(Context contex)
{
mContex = contex;
}
public void Handle(int args)
{
Debug.Log("状态B.Handle"+args);
//B状态切换到A状态下的条件
if (args <= 10)
{
//切换A状态
mContex.setState(new ConcreteStateA(mContex));
}
}
}
运行结果如图: