• 状态模式


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

    说白了,就是一个对象,在不同的状态下,表现出不同的行为,(例如:人在工作时,心情愉快、生气、烦恼、郁闷等不同的心情下,敲击键盘声音不同,

    和人聊天时语气不同,就像变了一个人似的),为了避免在一个对象中增加各种 if 状态分支判断,将状态拆分封装,同时也便于后续扩展(如增加 怒火冲天 心情)。

    一、UML结构图

    二、示例代码

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace 状态模式
     7 {
     8     class Program
     9     {
    10         static void Main(string[] args)
    11         {
    12             Context c = new Context(new ConcreteStateA());
    13 
    14             c.Request();
    15             c.Request();
    16             c.Request();
    17             c.Request();
    18 
    19             Console.Read();
    20 
    21         }
    22     }
    23 
    24     public class Context
    25     {
    26         private State m_CurrentState;
    27         /// <summary>
    28         /// 当前状态
    29         /// </summary>
    30         public State CurrentState
    31         {
    32           get { return m_CurrentState; }
    33           set { m_CurrentState = value; 
    34             Console.WriteLine("当前状态:"+m_CurrentState.GetType().Name);
    35           }
    36         }
    37 
    38         public Context(State state)
    39         {
    40             m_CurrentState=state;
    41         }
    42 
    43         //执行各个状态的相应的行为
    44         public void Request()
    45         {
    46             m_CurrentState.Handle(this);
    47         }
    48 
    49     }
    50 
    51     public abstract class State
    52     {
    53         //定义各状态下,相关的行为
    54         public abstract void Handle(Context context);
    55     }
    56 
    57     public class ConcreteStateA : State
    58     {
    59         public override void Handle(Context context)
    60         {
    61             //执行当前动作
    62             Console.WriteLine(string.Format("正在执行StateA状态"));
    63 
    64             //执行完毕后,切换为下一个状态
    65             context.CurrentState = new ConcreteStateB();
    66         }
    67     }
    68 
    69     public class ConcreteStateB : State
    70     {
    71         public override void Handle(Context context)
    72         {
    73             //执行当前动作
    74             Console.WriteLine(string.Format("正在执行StateB状态"));
    75 
    76             //执行完毕后,切换为下一个状态
    77             context.CurrentState = new ConcreteStateA();
    78         }
    79     }
    80 
    81 }
    示例代码

    执行效果:

    三、状态模式的好处与用处

    好处:

      1、将与特定状态相关的行为局部化,集中处理

      2、将不同状态的行为分隔开来。

  • 相关阅读:
    第十一单元 beego验证
    第九单元 ORM
    第六单元 go操作redis
    第五单元 go操作mysql
    第四单元 参数配置
    springboot使用外置tomcat
    ⚡ 第二.三章顺序表与链表⚡
    c语言程序设计题 译密码
    翁恺 java进阶第一周作业
    Java 构造素数表的两种方法
  • 原文地址:https://www.cnblogs.com/qiupiaohujie/p/11971081.html
Copyright © 2020-2023  润新知