状态模式
2023-04-18 15:22:22 时间
我们把影响对象行为的一个或多个动态变化的属性称为状态,状态模式所处理的对象是有状态的,当然状态复杂才能体现出模式的精髓。
简单一点例子就是等红路灯
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 } }
相关文章
- 关于json.dumps中的参数详解
- LeetCode笔记:Biweekly Contest 66
- pycharm如何创建项目
- LeetCode笔记:Weekly Contest 269
- vite的项目,使用 rollup 打包的方法
- 芯片巨头正在偷偷研发这些新AI技术,不比拍照有意思
- 斑马识别成狗,AI犯错的原因被斯坦福找到了
- Python3+Django2配置后台管理
- 隐藏与显示macos桌面文件
- (win环境)使用Electron打造一个桌面应用翻译小工具
- PhantomJS这几项功能你用过吗?
- php文件怎么在手机上打开
- 层层推进!Kubernetes 网络原理图解,我用这招!
- 这几年落地的DDD,都是智商税和大忽悠?
- 自己实现一个自定义React项目脚手架「ReactCli」
- 手把手教你实现一个图片压缩工具(Vue与Node的完美配合)
- 研发受阻?苹果绕不过的5G坎
- c++大作业–学籍管理系统–
- 智能运维行业乱象:估值虚高、上市受阻、裁员频现
- 我在鹅厂淘到了一波“炼丹神器”,开发者快打包