• 状态模式


    状态模式:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

    状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

    下面举例说明,假设有两种状态需要转换,每请求一次就转换一次状态:

    首先定义状态接口和两个具体的状态

        /// <summary>
        /// 抽象状态类,规定不同状态下共同的方法定义
        /// 将特定的状态行为都放入一个具体的状态对象中,由于所有与状态相关的代码都存在于某个具体状态类中,
        /// 所以可以通过定义新的子类可以很容易地增加新的状态和转换
        /// </summary>
        abstract class State
        {
            public abstract void Handle(Context context);
        }
    
        /// <summary>
        /// 在每个具体的状态内完成该状态下需要执行的具体操作
        /// </summary>
        class StateA : State
        {
            public override void Handle(Context context)
            {
                Console.WriteLine("当前状态为StateA");
                context.State = new StateB();
                Console.WriteLine("切换为StateB");
            }
        }
    
        class StateB : State
        {
            public override void Handle(Context context)
            {
                Console.WriteLine("当前状态为StateB");
                context.State = new StateA();
                Console.WriteLine("切换为StateA");
            }
        }
    

     下面定义一个上下文对象,该对象中存在一个状态属性

        class Context
        {
            public State State { get; set; }
    
            public Context(State state)
            {
                this.State = state;
            }
    
            /// <summary>
            /// 进行当前状态需要执行的操作
            /// </summary>
            public void Request()
            {
                State.Handle(this);
            }
        }
    

     客户端执行请求,实现状态切换

                //设置当前初始状态
                Context context = new Context(new StateA());
    
                //执行该状态下的操作,有可能会在操作中发生状态的转换
                context.Request();
                context.Request();
                context.Request();
                context.Request();
    

     执行结果为:

    当前状态为StateA
    切换为StateB
    当前状态为StateB
    切换为StateA
    当前状态为StateA
    切换为StateB
    当前状态为StateB
    切换为StateA

    可见,总共四次请求,状态也切换了4次

    状态模式的好处是将与特定状态相关的行为局部化,并将不同状态的行为分隔开来,通过把各种状态转移逻辑到State的字类中,从而消除庞大的条件分支语句,减少相互间的依赖。当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。

  • 相关阅读:
    Leetcode-Spiral Matrix
    Leetcode-Permuation Sequence
    浪潮服务器硬盘坏道数据恢复
    通过拼数据库碎片的方式恢复虚拟机磁盘文件丢失问题
    aix 6.1系统怎么安装?这里有详细图文教程
    技术文档分享_linux中生成考核用的GPT分区表结构修复
    python解释NTFS runlist的代码(文章转自北亚数据恢复张宇工程师)
    Unix下zfs文件系统重组RAID-5后可以这样恢复
    EXT3文件系统误删除导致文件系统中的邮件丢失恢复方法
    Hyper-V虚拟机故障导致数据文件丢失的数据恢复全过程
  • 原文地址:https://www.cnblogs.com/angela217/p/5439410.html
Copyright © 2020-2023  润新知