设计模式(七)—— 状态切换:状态模式

状态模式

状态模式(State Pattern),类的行为是基于它的状态改变的,状态模式主要解决的是当控制一个对象的条件表达式过于复杂的情况。把状态的判断逻辑装移到表示不同的一系列类当中,可以把复杂的判断逻辑简化。

  • 状态模式的好处是将特定的状态相关的行为局部化,并且将不同状态的行为分割开来。将特定行为的状态相关都放入一个对象中,由于所有的状态相关的代码都存在于某个ConcretaState,所以通过定义新的子类可以很容易地增加新的状态和转换。通俗来讲,状态模式就是为了消除庞大的条件分支语句。
  • 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

如下,以游戏常见的几种状态,开始、暂停、停止、重来几种状态为例,设计一个简单的状态模式类图
状态模式

    public class State
    {
        public virtual void DoAction(Game game)
        {
            throw new System.NotImplementedException();
        }
    }
    public class StartState : State
    {
        public override void DoAction(Game game)
        {
            Console.WriteLine("Start Game!");
            game.SetState(this);
        }
    }
    public class PauseState : State
    {
        public override void DoAction(Game game)
        {
            Console.WriteLine("Pause Game!");
            game.SetState(this);
        }
    }
    ...类似代码
    public class Game
    {
        private State state;

        public void SetState(State state)
        {
            this.state=state;
        }

        public State GetState()
        {
            return state;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Game game = new Game();
            StartState start = new StartState();
            start.DoAction(game);
            PauseState pause = new PauseState();
            pause.DoAction(game);
            StopState stop = new StopState();
            stop.DoAction(game);
        }
    }
输出结果:
Start Game!
Pause Game!
Stop Game!

从以上示例可以看出,使用状态模式虽然可以很方便的进行状态切换,但是也会新增很多状态类,一般简单的状态切换还是可以考虑常规的方法,针对一些大型系统,比较复杂的状态切换的类我们才考虑采用状态模式来设计,方便后期的扩展维护。例如在游戏开发中角色会分为行走、跑步、攻击、死亡以及胜利等各种状态,设计时就可以采用状态模式来设计角色的行为,让后后期更易于维护

文章参考菜鸟教程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值