用心理解设计模式——状态模式 (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的行为
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NRatel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值