C#设计模式(行为型模式):状态模式

C#设计模式:状态模式

在软件开发中,我们经常会遇到对象的行为取决于其状态的情况。例如,一个订单对象可能处于“待支付”、“已支付”、“已发货”等不同状态,而每个状态下订单的行为(例如是否可以支付、是否可以发货)是不同的。

传统的处理方式是使用大量的 if-elseswitch-case 语句来判断对象的状态,然后执行相应的行为。这种方式虽然直观,但随着状态数量的增加,代码会变得臃肿、难以维护,并且违背了开放-封闭原则。

状态模式 (State Pattern) 提供了一种优雅的解决方案,它将对象的状态抽象成独立的类,并将对象的行为委托给当前状态对象。这样,对象就可以在不同的状态下表现出不同的行为,而无需修改自身的代码。

一、状态模式的结构

状态模式主要包含以下几个角色:

  • Context(上下文): 定义客户感兴趣的接口,并维护一个具体状态对象的实例,该实例定义了对象的当前状态。
  • State(状态): 定义一个接口,用于封装与 Context 的特定状态相关的行为。
  • ConcreteState(具体状态): 实现 State 接口,每个具体状态类对应对象的一种状态,并实现该状态下的行为。

二、状态模式的实现

以下是一个简单的 C# 示例,演示如何使用状态模式实现一个订单系统:

// Context 类
public class Order
{private OrderState _state;public Order(){// 初始状态为待支付_state = new PendingPaymentState(this);}public void SetState(OrderState state){_state = state;}public void Pay(){_state.Pay();}public void Ship(){_state.Ship();}public void Cancel(){_state.Cancel();}
}// State 接口
public interface OrderState
{void Pay();void Ship();void Cancel();
}// 具体状态类:待支付
public class PendingPaymentState : OrderState
{private Order _order;public PendingPaymentState(Order order){_order = order;}public void Pay(){Console.WriteLine("订单支付成功!");_order.SetState(new PaidState(_order));}public void Ship(){Console.WriteLine("订单未支付,无法发货!");}public void Cancel(){Console.WriteLine("订单已取消!");_order.SetState(new CancelledState(_order));}
}// 具体状态类:已支付
public class PaidState : OrderState
{private Order _order;public PaidState(Order order){_order = order;}public void Pay(){Console.WriteLine("订单已支付,无需重复支付!");}public void Ship(){Console.WriteLine("订单发货成功!");_order.SetState(new ShippedState(_order));}public void Cancel(){Console.WriteLine("订单已支付,无法取消!");}
}// 具体状态类:已发货
public class ShippedState : OrderState
{private Order _order;public ShippedState(Order order){_order = order;}public void Pay(){Console.WriteLine("订单已发货,无法支付!");}public void Ship(){Console.WriteLine("订单已发货,无需重复发货!");}public void Cancel(){Console.WriteLine("订单已发货,无法取消!");}
}// 具体状态类:已取消
public class CancelledState : OrderState
{private Order _order;public CancelledState(Order order){_order = order;}public void Pay(){Console.WriteLine("订单已取消,无法支付!");}public void Ship(){Console.WriteLine("订单已取消,无法发货!");}public void Cancel(){Console.WriteLine("订单已取消,无需重复取消!");}
}// 客户端代码
class Program
{static void Main(string[] args){Order order = new Order();order.Pay();   // 输出:订单支付成功!order.Ship();  // 输出:订单发货成功!order.Cancel(); // 输出:订单已发货,无法取消!}
}

三、状态模式的优点

  • 将状态相关的行为局部化: 将与特定状态相关的行为封装在独立的类中,使得代码更加清晰、易于理解和维护。
  • 避免使用大量的条件语句: 通过将状态转换逻辑分散到各个状态类中,可以避免使用大量的 if-elseswitch-case 语句,提高代码的可读性和可维护性。
  • 方便添加新的状态: 如果需要添加新的状态,只需要创建新的具体状态类,并实现相应的行为即可,无需修改现有的代码,符合开放-封闭原则。

四、状态模式的适用场景

  • 对象的行为取决于其状态,并且状态数量较多。
  • 需要在运行时根据状态改变对象的行为。
  • 需要避免使用大量的条件语句来判断对象的状态。

五、总结

状态模式是一种非常有用的设计模式,它可以帮助我们更好地组织和管理对象的状态和行为。通过将状态抽象成独立的类,并将行为委托给当前状态对象,我们可以使代码更加清晰、易于理解和维护。

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

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

相关文章

weblogic安装 12.2.1.4.0 单机

fmw_12.2.1.4.0_wls.jar和jdk-8u341-linux-x64.tar.gz&#xff0c;安装weblogic 安装JDK 8 # 1. 创建Java安装目录 mkdir -p /usr/java cd /usr/java# 2. 解压JDK tar -zxvf jdk-8u341-linux-x64.tar.gz# 3. 配置环境变量 cat >> /etc/profile << EOF export JAV…

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。

vue elementUI Plus实现拖拽流程图&#xff0c;不引入插件&#xff0c;纯手写实现。 1.设计思路&#xff1a;2.设计细节3.详细代码实现 1.设计思路&#xff1a; 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…

SpringBoot+Vue养老院管理系统设计与实现【开题报告+程序+安装部署+售后讲解】

【1】系统介绍 一、研究背景 随着中国人口老龄化的加剧&#xff0c;养老问题已成为社会关注的热点话题。传统的养老服务模式难以满足日益增长的老年人群体的需求&#xff0c;尤其是在信息化和智能化方面存在明显不足。为了提高养老服务效率&#xff0c;改善老年人生活质量&am…

【网络安全 | 漏洞挖掘】通过模拟功能实现提权(Bugcrowd)

未经许可,不得转载。 我将与大家分享我在 Bugcrowd 的某个项目中发现的一个漏洞,该项目中有一个“用户模拟”功能。 什么是用户模拟? 用户模拟允许管理员在不知晓用户凭据的情况下“以用户身份登录”。这种功能常见于管理员需要调试问题、审查用户权限或解决投诉的平台中。…

ValuesRAG:以检索增强情境学习强化文化对齐

随着大型语言模型&#xff08;LLMs&#xff09;的迅猛发展&#xff0c;其在各个领域展现出强大的能力。然而&#xff0c;训练数据中西方中心主义的倾向&#xff0c;使得 LLMs 在文化价值观一致性方面面临严峻挑战&#xff0c;这一问题在跨文化场景中尤为突出&#xff0c;可能导…

【CSS】第二天 画盒子、文字控制属性

【CSS】第二天 1. 画盒子2. 文字控制属性2.1 字体大小2.2 字体粗细2.3 字体样式是否倾斜2.4 行高2.5 行高-垂直居中2.6 字体族2.7 字体复合属性 font 1. 画盒子 目标&#xff1a;使用合适的选择器画盒子。 新属性 <!DOCTYPE html> <html> <head><meta …

东京大学联合Adobe提出基于指令的图像编辑模型InstructMove,可通过观察视频中的动作来实现基于指令的图像编辑。

东京大学联合Adobe提出的InstructMove是一种基于指令的图像编辑模型&#xff0c;使用多模态 LLM 生成的指令对视频中的帧对进行训练。该模型擅长非刚性编辑&#xff0c;例如调整主体姿势、表情和改变视点&#xff0c;同时保持内容一致性。此外&#xff0c;该方法通过集成蒙版、…

一文讲明白朴素贝叶斯算法及其计算公式(入门普及)

1、贝叶斯算法 贝叶斯定理由英国数学家托马斯贝叶斯 ( Thomas Bayes) 提出的&#xff0c;用来描述两个条件概率之间的关系。通常&#xff0c;事件A在事件B 发生的条件下与事件 B 在事件 A 发生的条件下&#xff0c;它们两者的概率并不相同&#xff0c;但是它们两者之间存在一定…

SpringBoot Maven 项目 pom 中的 plugin 插件用法整理

把 SpringBoot Maven 项目打包成 jar 文件时&#xff0c;我们通常用到 spring-boot-maven-plugin 插件。 前面也介绍过&#xff0c;在 spring-boot-starter-parent POM 和 spring-boot-starter POM 中都有插件的管理&#xff0c;现在我们就撸一把构建元素中插件的用法。 一、…

PDF文件提示-文档无法打印-的解决办法

背景信息 下载了几个签名的PDF文件&#xff0c;想要打印纸质版&#xff0c;结果打印时 Adobe Acrobat Reader 提示【文档无法打印】: 解决办法 网上的方案是使用老版本的PDF阅读器&#xff0c; 因为无法打印只是一个标识而已。 PDF文件不能打印的五种解决方案-zhihu 这些方…

SQL Server 数据库 忘记密码

1、先用windows 身份验证 连接 2、安全性--登录名 3、设置 身份验证 4、重启电脑 5、登录 登陆成功!!! ------------------------------------------------------------------ --1、查询登录账号信息 ------------------------------------------------------------------ -- …

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考&#xff0c;oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场&#xff0c;主要考察 nmap的使用已经是否会看输出&#xff0c;以及是否会通过应用查找对应漏…

OpenGL材质系统和贴图纹理

上一篇文章当中笔者为大家介绍了风氏光照模型&#xff0c;相信大家也发现了光照着色器当中有设置有很多控制光照强度的参数&#xff0c;而所谓的材质系统就是我们可以人为的去调节这些参数&#xff0c;让一个物体的反光效果能够更加接近我们现实生活当中的一些物体。 材质系统…

光缆生产车间可视化,让智能制造更透明

图扑光缆生产车间可视化系统通过实时监控和数据分析&#xff0c;优化生产流程&#xff0c;提升产品质量和产能效率&#xff0c;为光缆制造业提供智能化解决方案&#xff0c;推动产业升级。

深入理解 Java 接口的回调机制

前言 回调是一种非常重要的编程技术&#xff0c;它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中&#xff0c;回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式&#xff0c;以及实际开发中的应用场景。 泪崩了&#xff0c;期末…

LangChain 介绍

LangChain 是一个用于构建语言模型驱动的应用程序&#xff08;Language Model Applications&#xff09;的开发框架&#xff0c;旨在帮助开发者将大型语言模型&#xff08;LLMs&#xff09;集成到更复杂的、具备上下文感知能力的应用中。LangChain 支持使用模型如 OpenAI GPT-3…

Nginx代理本地exe服务http为https

Nginx代理本地exe服务http为https 下载NginxNginx命令exe服务http代理为https 下载Nginx 点击下载Nginx 下载好之后是一个压缩包&#xff0c;解压放到没有中文的路径下就可以了 Nginx命令 调出cmd窗口cd到安装路径 输入&#xff1a;nginx -v 查看版本 nginx -h&#xff…

cursor 使用技巧

一、创建项目前期步骤 1.先给AI设定一个对应项目经理角色&#xff0c; 2.然后跟AI沟通项目功能&#xff0c;生成功能设计文件&#xff1a;README.md README.md项目功能 3.再让AI总结写出开发项目规则文件&#xff1a; .cursorrules 是技术栈进行限定&#xff0c;比如使用什…

创建并配置华为云虚拟私有云

目录 私有云 创建虚拟私有云 私有云 私有云是一种云计算模式&#xff0c;它将云服务部署在企业或组织内部的私有基础设施上&#xff0c;仅供该企业或组织内部使用&#xff0c;不对外提供服务.私有云的主要特点包括&#xff1a; 私密性&#xff1a;私有云的资源&#xff08;如…

【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你的 起始分数 为 0 。 在一步 操作 中&#xff1a; 选出一个满足 0 < i < nums.length 的下标 i &#xff0c; 将你的 分数 增加 nums[i] &#xff0c;并且 将 nums[i] 替换为 ceil(nums[i] / 3) 。 返回在 恰好…