用心理解设计模式——状态模式 (State Pattern)

前置文章: 设计模式的原则 

其他设计模式:用心理解设计模式

设计模式相关代码已统一放至 我的 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的行为
        }
    }
}

猜你喜欢

转载自blog.csdn.net/NRatel/article/details/84672871