当前位置: 首页 >  网技达人 >  状态模式

状态模式

导读:我们把影响对象行为的一个或多个动态变化的属性称为状态,状态模式所处理的对象是有状态的,当然状态复杂才能体现出模式的精髓。.简单一点例子就是等红路灯.namespace 状态模式一.{.internal class Program.{.static void Main(string

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

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

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 }
}
内容
  • 最新消息,powershell,10多年的癌症被治好了!
    最新消息,powershell,
    2023-12-10
    问:癌症是指什么?.答:.powershell一直有个特性,它的管道会传递对象,请看:.‘abc’ | ForEach-
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 常用的 http 状态码有哪些?
    常用的 http 状态码有哪些?
    2023-12-08
    在我们进行网页,网址的访问过程中,http,https.都是我们主要使用到的协议,在使用这协议的时候,对于他的协助状态,
  • Three.js教程:对象克隆、复制
    Three.js教程:对象克隆、
    2023-12-08
    推荐:将 NSDT场景编辑器 加入你的3D工具链.其他系列工具: NSDT简石数字孪生.对象克隆.clone()和复制.
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • onps栈1.1版本发布
    onps栈1.1版本发布
    2023-12-01
    更新内容.增加了ipv6支持,支持ipv6地址状态及无状态自动配置;.tcp实现延迟应答(DACK,Delayed Ac
  • 电子商务平台开发
    电子商务平台开发
    2023-12-31
    电子商务平台开发.产品介绍.我们的电子商务平台开发是为希望在互联网上建立自己的在线商店的企业和个人量身定制的一款全方位电
  • 电子元件连接器
    电子元件连接器
    2023-12-31
    电子元件连接器.产品功能.电子元件连接器是一种用于连接不同电子元件的重要组件。它可以提供可*的电气连接,从而实现各种电子
  • ***云化解决方案
    ***云化解决方案
    2023-12-11
    ***云化解决方案.产品描述.我们的服务器云化解决方案是一款专为企业提供的高效、灵活的云计算解决方案。通过将传****进
  • ***虚拟化解决方案
    ***虚拟化解决方案
    2024-01-05
    ***虚拟化解决方案产品介绍.我们公司自豪地推出了全新的服务器虚拟化解决方案,该产品旨在帮助企业更高效地利用服务器资源,
  • 电子元件继电器
    电子元件继电器
    2024-01-10
    电子元件继电器.产品功能.电子元件继电器是一种用于控制电路的开关装置,通过控制电磁吸引力的改变来实现开关的闭合和断开。它
  • 软件定制开发服务
    软件定制开发服务
    2024-01-05
    软件定制开发服务.产品功能.我们的软件定制开发服务为客户提供了一站式的解决方案,包括需求分析、设计开发、**部署和维护支
  • 数据分析和挖掘软件
    数据分析和挖掘软件
    2023-12-06
    数据分析和挖掘软件.产品功能.我们的数据分析和挖掘软件提供了丰富的功能,能够帮助用户快速有效地实现数据分析和挖掘,包括数
  • ***软件
    ***软件
    2023-12-06
    ***软件产品介绍.产品描述.我们的服务器软件是一款高性能、稳定可靠的服务器管理软件,具有强大的功能和灵活的配置,适用于
  • ***远程监控系*
    ***远程监控系*
    2023-12-16
    ***远程监控系*.产品功能.我们的服务器远程监控系*是一款针对企业服务器管理的智能监控系*。它具有实时监控、远程操作、
  • 互联网金融服务平台
    互联网金融服务平台
    2024-01-10
    互联网金融服务平台.产品功能.个人理财:用户可以通过平台进行投资理财,选择适合自己的理财产品,实现资金增值。.贷款服务: