首页 > 其他分享 >状态模式

状态模式

时间:2023-02-11 13:01:03浏览次数:38  
标签:状态 void 模式 Display State Action public

我们把影响对象行为的一个或多个动态变化的属性称为状态,状态模式所处理的对象是有状态的,当然状态复杂才能体现出模式的精髓。

简单一点例子就是等红路灯

namespace 状态模式一
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TrafficLight trafficLight = new TrafficLight(new GreenLightState());
            trafficLight.Show();
            trafficLight.SetState(new YellowLightState());
            trafficLight.Show();
            trafficLight.SetState(new RedLightState());
            trafficLight.Show();
        }
    }

    /// <summary>
    /// 定义状态的抽象类
    /// </summary>
    public abstract class TrafficLighState
    {
        public abstract void Display();
    }

    #region 具体实现
    public class RedLightState : TrafficLighState
    {
        public override void Display()
        {
            Console.WriteLine("RedLight");
        }
    }
    public class GreenLightState : TrafficLighState
    {
        public override void Display()
        {
            Console.WriteLine("GreenLight");
        }
    }
    public class YellowLightState : TrafficLighState
    {
        public override void Display()
        {
            Console.WriteLine("YellowLight");
        }
    } 
    #endregion

    /// <summary>
    /// 状态控制类
    /// </summary>
    public class TrafficLight
    {
        private TrafficLighState trafficLighState;
        public TrafficLight(TrafficLighState trafficLighState)
        {
            this.trafficLighState = trafficLighState;
        }
        public void SetState(TrafficLighState state)
        {
            trafficLighState = state;
        }
        public void Show()
        {
            trafficLighState.Display();
        }
    }
}

上面实例状态控制类控制的是一个状态的类型,看起来很眼熟,比如策略模式(他是通过委托来控制行为),又比如模板方法(通过继承来控制行为),只不过这里是控制一个状态类。

下面通过汽车的状态举的例子:

using System.Numerics;
using static System.Runtime.InteropServices.JavaScript.JSType;

namespace 状态模式二
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var lamborghini = new Car();

            Display(lamborghini.CurrentState);
            lamborghini.TaskAction(Action.Start);

            Display(lamborghini.CurrentState);
            lamborghini.TaskAction(Action.Start);

            Display(lamborghini.CurrentState);
            lamborghini.TaskAction(Action.Accelerate); //加速

            Display(lamborghini.CurrentState);
            lamborghini.TaskAction(Action.Stop);

            Display(lamborghini.CurrentState);
            /* result
                车辆当前状态: Stopped
                车辆当前状态:Started
                车辆当前状态:Started
                车辆当前状态:Running
                车辆当前状态:Stopped
            */
        }
        static void Display(State state)
        {
            Console.WriteLine($"车辆当前状态:{state}");
        }
    }
    /// <summary>
    /// 模拟汽车的状态和驾驶员的动作判断车辆当前的状态
    /// </summary>
    public class Car
    {
        private State state = State.Stopped;
        public State CurrentState { get { return state; } }

        public void TaskAction(Action action)
        {
            state = (state, action) switch
            {
                (State.Stopped, Action.Start) => State.Started,
                (State.Started, Action.Accelerate) => State.Running,
                (State.Started, Action.Stop) => State.Stopped,
                (State.Running, Action.Stop) => State.Stopped,
                _ => state
            };
        }
    }
    public enum State { Stopped, Started, Running }
    public enum Action { Stop, Start, Accelerate }
}

标签:状态,void,模式,Display,State,Action,public
From: https://www.cnblogs.com/morec/p/17111248.html

相关文章

  • ipv6地名词:有状态(dhcpv6),无状态(slaac),前缀代理(pd)等解释
    ipv6地址获取有两种方式:路由器通告的前缀+自己编的后缀(无状态,stateless)DHCP给一个/128的地址(有状态,stateful)需要明确:无状态和有状态,仅仅指的是ipv6地址的获取方式。......
  • vue2的数据绑定是通过数据劫持和观察者模式实现的。(先感受到变化,再去渲染)
     1、数据劫持:当把一个普通的JavaScript对象(json)传入Vue实例作为data选项,Vue将遍历此对象所有的属性,并使用Object.defineProperty把这些属性全部转为getter/set......
  • CSS架构之BEM设计模式
    为什么需要CSS架构?其实在日常开发CSS当中,会遇到许多的问题,使用设计模式能够很好的解决。例如在日常开发项目,需要组件化时,组件内部的class样式类管理就非常的杂乱。大部分......
  • 野火STM32 ADC独立模式单通道采集实验意外
    1//aboutcalibration2//ADC_ResetCalibration(ADC1);3//while(ADC_GetResetCalibrationStatus(ADC1)!=SET);4ADC_StartCalibration(ADC1);5......
  • statefulset详解及为何结合headless service部署有状态应用
    1.1有状态应用管理statefulsetStatefulSet(有状态集,缩写为sts)常用于部署有状态的且需要有序启动的应用程序,比如在进行SpringCloud项目容器化时,Eureka的部署是比较适合用St......
  • 《Terraform 101 从入门到实践》 第四章 States状态管理
    《Terraform101从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。军书十二卷,卷卷有爷名。为......
  • 单例模式
    [Java单例模式详解]概念:java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。单例模式有一下特点:1、单例类只能......
  • 策略模式
    [Java策略模式详解]1、什么是策略模式?策略模式(StrategyPattern):定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。2、策略模式定义①、Context封装角色它......
  • 三大常用集群leader选举+哨兵模式原理
    一,Zookeeper集群的leader选举Zookeeper的选举机制两个触发条件:集群启动阶段和集群运行阶段leader挂机(这2种场景下选举的流程基本一致)1,Zookeeper集群中的follower检测到......
  • 基于Verilog HDL的状态机描述方法
    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合VerilogHDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。......