zoukankan      html  css  js  c++  java
  • 状态模式-设计模式系列

    状态模式

     

         概述:

     

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

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

     

         意图:

     

           允许一个对象在其内部状态改变时改变它的行为

     

         结构图:

     

       

     

     

          举例:

           

                 在日常生活中最为熟悉的点灯开关,按一下开灯,在按一下关灯,我们用代码来实现这种效果。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
        /// <summary>
        /// 它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
        /// </summary>
      public   class Context
        {
     
            private AbstractState _state;
            public AbstractState State
            {
                get{return _state;}
                set { _state=value;}
            }
            //初始状态
            public Context(AbstractState state)
            {
                _state = state;
            }
            //按下开关
            public void Press()
            {
                //传入当前的状态
                _state.Press(this);
            }
     
        }
        /// <summary>
        /// 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
        /// </summary>
      public  abstract class  AbstractState
       {
           //按下动作
           public  abstract void Press(Context context);
         
       }
        /// <summary>
       /// 具体状态(Concrete State):实现抽象状态定义的接口。开灯
        /// </summary>
       public class ConcreteStateOn:AbstractState
       {
     
           public override void Press(Context context)
           {
               Console.WriteLine("开灯");
               //开灯了 那么久得把下一个动作设置成关灯
               context.State = new ConcreteStateOff();
                
           }
       }
       /// <summary>
       /// 具体状态(Concrete State):实现抽象状态定义的接口。关灯
       /// </summary>
       public class ConcreteStateOff : AbstractState
       {
     
           public override void Press(Context context)
           {
               Console.WriteLine("关灯");
               //关灯了就得把下一个动作设置成开灯
               context.State = new ConcreteStateOn();
           }
       }

     

    客户端调用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        class Program
        {
            static void Main(string[] args)
            {
                //灯处于关闭状态 第一次是开灯动作
                Context context = new Context(new ConcreteStateOn());
                context.Press();//按下开关
                context.Press();//在按下开关
                Console.ReadLine();
            }
        }

     

           适用场景:

     

             1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

             2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

     

               

                  设计模式系列文章入口

  • 相关阅读:
    java——testNG——工作复习——xml详解
    转义符,re模块,rangdom随机数模块,
    nyoj 814又见拦截导弹
    Soj题目分类
    Xcode 性能优化
    python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法(pip使用豆瓣源)
    浅谈模拟退火
    43-正则表达式(1)
    命令行上的narrowing(随着输入逐步减少备选项)工具
    有效决策,这么做就对了!
  • 原文地址:https://www.cnblogs.com/sc0791/p/3682260.html
Copyright © 2011-2022 走看看