C#设计模式--状态模式(State Pattern)

状态模式是一种行为设计模式,它允许对象在其内部状态发生变化时改变其行为。这种模式的核心思想是将状态封装在独立的对象中,而不是将状态逻辑散布在整个程序中。

用途

  1. 简化复杂的条件逻辑:通过将不同的状态封装在不同的类中,可以避免大量的条件语句,使代码更清晰、更易于维护。
  2. 提高可扩展性:添加新的状态或修改现有状态的行为时,只需修改或新增相应的状态类,而不需要修改现有的代码。
  3. 提高代码的复用性:状态对象可以在多个上下文对象之间共享,提高代码的复用性。
    示例代码及类图

示例1:交通信号灯

public interface ILightState
{void Handle(TrafficLight context);
}public class RedLightState : ILightState
{public void Handle(TrafficLight context){Console.WriteLine("Red Light");context.SetState(new GreenLightState());}
}public class GreenLightState : ILightState
{public void Handle(TrafficLight context){Console.WriteLine("Green Light");context.SetState(new YellowLightState());}
}public class YellowLightState : ILightState
{public void Handle(TrafficLight context){Console.WriteLine("Yellow Light");context.SetState(new RedLightState());}
}public class TrafficLight
{private ILightState _state;public TrafficLight(ILightState initialState){_state = initialState;}public void ChangeLight(){_state.Handle(this);}public void SetState(ILightState state){_state = state;}
}

类图

ILightState
+void Handle(TrafficLight context)
RedLightState
+void Handle(TrafficLight context)
GreenLightState
+void Handle(TrafficLight context)
YellowLightState
+void Handle(TrafficLight context)
TrafficLight
-ILightState _state
+TrafficLight(ILightState initialState)
+void ChangeLight()
+void SetState(ILightState state)

示例2:订单状态管理

public interface IOrderState
{void Handle(Order context);
}public class PendingState : IOrderState
{public void Handle(Order context){Console.WriteLine("Order is pending");context.SetState(new ProcessingState());}
}public class ProcessingState : IOrderState
{public void Handle(Order context){Console.WriteLine("Order is being processed");context.SetState(new ShippedState());}
}public class ShippedState : IOrderState
{public void Handle(Order context){Console.WriteLine("Order has been shipped");context.SetState(new DeliveredState());}
}public class DeliveredState : IOrderState
{public void Handle(Order context){Console.WriteLine("Order has been delivered");}
}public class Order
{private IOrderState _state;public Order(IOrderState initialState){_state = initialState;}public void Process(){_state.Handle(this);}public void SetState(IOrderState state){_state = state;}
}

类图

IOrderState
+void Handle(Order context)
PendingState
+void Handle(Order context)
ProcessingState
+void Handle(Order context)
ShippedState
+void Handle(Order context)
DeliveredState
+void Handle(Order context)
Order
-IOrderState _state
+Order(IOrderState initialState)
+void Process()
+void SetState(IOrderState state)

示例3:游戏角色状态

public interface ICharacterState
{void Handle(Character context);
}public class IdleState : ICharacterState
{public void Handle(Character context){Console.WriteLine("Character is idle");context.SetState(new WalkingState());}
}public class WalkingState : ICharacterState
{public void Handle(Character context){Console.WriteLine("Character is walking");context.SetState(new RunningState());}
}public class RunningState : ICharacterState
{public void Handle(Character context){Console.WriteLine("Character is running");context.SetState(new IdleState());}
}public class Character
{private ICharacterState _state;public Character(ICharacterState initialState){_state = initialState;}public void Move(){_state.Handle(this);}public void SetState(ICharacterState state){_state = state;}
}

类图

ICharacterState
+void Handle(Character context)
IdleState
+void Handle(Character context)
WalkingState
+void Handle(Character context)
RunningState
+void Handle(Character context)
Character
-ICharacterState _state
+Character(ICharacterState initialState)
+void Move()
+void SetState(ICharacterState state)

代码解析

  1. 状态接口 (IState):定义了一个 Handle 方法,所有具体状态类都需要实现这个方法。
  2. 具体状态 (StateAStateB):实现了 IState 接口,具体实现了 Handle 方法。在处理完当前状态后,可以改变上下文的当前状态。
  3. 上下文类 (Context):维护一个对当前状态的引用,并提供一个方法 Request 来调用当前状态的 Handle 方法。上下文还提供了一个属性 State 来改变当前状态,并在状态改变时输出相关信息。

优点

  1. 简化条件逻辑:通过将状态逻辑封装在不同的类中,减少了大量的条件语句,使代码更清晰、更易于维护。
  2. 提高可扩展性:添加新的状态或修改现有状态的行为时,只需修改或新增相应的状态类,而不需要修改现有的代码。
  3. 提高代码的复用性:状态对象可以在多个上下文对象之间共享,提高代码的复用性。

缺点

  1. 增加类的数量:每种状态都需要一个类,这可能会导致类的数量增多,增加系统的复杂性。
  2. 状态转换逻辑分散:状态转换的逻辑分布在不同的状态类中,有时可能难以追踪和理解。
  3. 过度设计:对于简单的状态转换,使用状态模式可能会显得过于复杂,增加不必要的开销。

总结

状态模式适用于需要管理多种状态和状态转换的场景,特别是在状态逻辑较为复杂的情况下。通过将状态逻辑封装在独立的类中,可以使代码更加模块化、易于维护和扩展。然而,在简单的情况下,使用状态模式可能会增加不必要的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 自启动失败:Failed to parse PID from file: Invalid argument

记一次nginx自启动配置的问题 我的配置如下: [Unit] DescriptionA high performance web server and a reverse proxy server Afternetwork.target[Service] Typeforking PIDFile/home/u24/nginx/pid/nginx.pid ExecStartPre/home/u24/nginx/sbin/nginx -t -q -g d…

React基础知识四 Hooks

什么是hooks? (coderwhy) hooks是react 16.8(2019年)出的新特性。 react有两种形式来创建组件——类式和函数式。在hooks之前类式组件就是react最主流的编程方式。 这个时候,函数式组件是非常鸡肋的,几乎没什么用。因…

电子病历静态数据脱敏路径探索

一、引言 数据脱敏(Data Masking),屏蔽敏感数据,对某些敏感信息(比如patient_name、ip_no、ad、no、icd11、drug等等 )通过脱敏规则进行数据的变形,实现隐私数据的可靠保护。电子病历作为医疗领…

迷宫路径搜索:广度优先搜索(BFS)

迷宫路径搜索:广度优先搜索(BFS)详解 1. 什么是广度优先搜索(BFS)? 广度优先搜索(BFS) 是一种在图或网格结构中逐层扩展节点的搜索算法,适合用于解决最短路径问题。 特点…

AIGC 012-Video LDM-更进一步,SD作者将LDM扩展到视频生成任务!

AIGC 012-Video LDM-Stable Video diffusion前身,将LDM扩展到视频生成任务! 文章目录 0 论文工作1论文方法实验结果 0 论文工作 Video LDM作者也是Stable diffusion的作者,作者在SD的架构上进行扩展,实现了视频的生成。后续在Vid…

openstack创建浮动IP全过程

1、创建外部网络,即是provider网络,有关provider网络的详细解释请参见我之前的文章openstack中的self-service和provider网络_openstack provider网络不能创建vlan吗-CSDN博客 network create --share --external --provider-physical-network physnet1…

ABAP DIALOG屏幕编程1

一、DIALOG屏幕编程 DIALOG屏幕编程是SAP ABAP中用于创建用户交互界面的一种技术,主要用于开发事务性应用程序。它允许用户通过屏幕输入或操作数据,程序根据用户的操作执行逻辑处理。 1、DIALOG编程的主要组件 a、屏幕 (Screen) DIALOG程序的核心部分…

Anaconda升级的解决方法

文章目录 关于conda升级问题1. 在原Anaconda版本上进行更新升级2. 就是重装Anaconda 镜像源配置的参数解释:1. conda-forge2. bioconda3. menpo 关于conda升级问题, Anaconda各种版本镜像下载地址: 关于conda升级问题 1. 在原Anaconda版本上…

服务路由和服务发现区别是什么?

要快速学习服务路由和服务发现的区别,以下是这个领域最重要的20%的知识: 服务路由(Service Routing) 定义:服务路由是微服务架构中的一个关键概念,涉及将客户端的请求路由到合适的服务实例上。在分布式系…

青训营-豆包MarsCode技术训练营试题解析二十七

介绍 ‌豆包青训营‌是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目。该项目的目标是培养具有职业竞争力的优秀开发工程师,并提供全程免费的课程,不收取任何费用‌。 课程内容和方向 豆包青训营的课程涵盖前端、后端和AI方向。在这个飞…

网络安全之信息收集

1、大纲 基本信息收集  网站后台查找 域名查找    整站分析 敏感目录    Googlehacker 端口扫描    URL采集 旁站C段    信息分析 CDN绕过方法 2、域名信息 对应IP收集 相关域名对应IP 站长之家-->站长工具 nslookup(在cmd里面使用&…

人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换

接触人工智能的学习三个月了,每天与各种安装包作斗争,缺少依赖包、版本高了、版本低了、不兼容了、系统做一半从头再来了。。。这些都是常态。三个月把单位几台电脑折腾了不下几十次安装,是时候总结一下踩过的坑和积累的经验了。 以一个典型的…

乐橙云小程序插件接入HbuilderX

乐橙插件使用: 1.配置app.json文件,uniapp中在mainfest.json中配置 https://uniapp.dcloud.net.cn/collocation/manifest.html#mp-weixin ** 2、集成插件页面.json文件 ** uniapp在 pages.json 对应页面的 style -> usingComponents 引入组件&…

华为关键词覆盖应用市场ASO优化覆盖技巧

在我国的消费者群体当中,华为的品牌形象较高,且产品质量过硬,因此用户基数也大。与此同时,随着影响力的增大,华为不断向外扩张,也逐渐成为了海外市场的香饽饽。作为开发者和运营者,我们要认识到…

C#白盒测试(二)

在前两篇关于 C#白盒测试的学习博客中,我们已经对基础概念、常见结构测试以及一些工具的使用有了一定了解。今天,我们将聚焦于白盒测试中的数据驱动测试、测试替身以及如何优化测试套件,进一步提升我们的白盒测试能力。 一、数据驱动测试 在…

K8S疑难概念理解——容器运行时。CRI实现从Docker切为containerd历史

早期版本的k8s直接使用了docker部分功能,比如容器的创建、运行、监控、停止、销毁等,这一些与容器生命周期相关的逻辑实现就可称之为容器运行时。k8s意识到docker过于笨重,如docker-cli,docker swarm等组件k8s都用不上,那么能不能…

Vue+Vite 组件开发的环境配置(超级简单)

vite是什么 Vite 是一个现代化的前端构建工具和开发服务器,它特别适用于构建大型的单页面应用(SPA)。Vite 旨在提供极快的冷启动速度,并且能够即时地(几乎实时地)更新模块,这得益于其利用原生 …

vue拖拽图片

这是我封装的组件大家直接用就好 我的gitee仓库地址 拖拽(父子) 刘志辉/vue功能 - 码云 - 开源中国 //使用页面参考文档 //标签内 :imgSrc"../img/tibet-1.jpg" <!-- 设置图片路径 --> dragstart"handleDragStart" <!-- 监听拖拽开始…

GNU/Linux - make 60s介绍

Learn make in 60 seconds. A programmer needs a build system. 想想你要手动输入编译命令编译每一个源文件&#xff0c;而且要正确添加和管理各个option&#xff0c;是很麻烦的。有各种用来帮助你build的工具&#xff0c;比如ant、make、maven、rake等。Make就是最通用的一…

C05S01-Web基础和HTTP协议

一、Web基础 1. Web相关概念 1.1 URL URL&#xff08;Uniform Resource Locator&#xff0c;统一资源定位符&#xff09;&#xff0c;是一种用于在互联网上标识和定位资源的标准化地址&#xff0c;提供了一种访问互联网上特定资源的方法。URL的基本格式如下所示&#xff1a;…