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.mzph.cn/diannao/66255.shtml

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

相关文章

数据结构C语言描述9(图文结合)--二叉树和特殊书的概念,二叉树“最傻瓜式创建”与前中后序的“递归”与“非递归遍历”

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

Leetcode打卡:设计一个ATM机器

执行结果:通过 题目 2241 设计一个ATM机器 一个 ATM 机器,存有 5 种面值的钞票:20 ,50 ,100 ,200 和 500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。 取款时&#xff0c…

vscode如何离线安装插件

在没有网络的时候,如果要安装插件,就会麻烦一些,需要通过离线安装的方式进行。下面记录如何在vscode离线安装插件。 一、下载离线插件 在一台能联网的电脑中,下载好离线插件,拷贝到无法联网的电脑上。等待安装。 vscode插件商店地址:https://marketplace.visualstudio.co…

用Tkinter制作一个用于合并PDF文件的小程序

需要安装PyPDF2库,具体原代码如下: # -*- coding: utf-8 -*- """ Created on Sun Dec 29 14:44:20 2024author: YBK """import PyPDF2 import os import tkinter as tk import windndpdf_files [] def dragged_files(f…

CDP集成Hudi实战-Hive

[〇]关于本文 本文测试一下使用Hive和Hudi的集成 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]部署Jar包 1-部署hudi-hive-sync-bundle-1.0.0.jar文件 [rootcdp73-1 ~]# for i in $(se…

公司资产网站

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

CSS——2.书写格式一

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写中&#xff1a;--><!--1.css 由属性名:属性值构成--><!--style"color: red;font-size: 20px;&quo…

基于FPGA的辩论赛系统设计-8名选手-正反两方-支持单选手评分-正反两方评分总和

基于FPGA的辩论赛系统设计 功能描述一、系统概述二、仿真波形视频 功能描述 1.答辩倒计时功能&#xff0c;当正反任意一方开始答辩后&#xff0c;倒计时30S。在倒计时最后10S后&#xff0c;LED灯开始闪烁。 2.答辩评分和计分功能&#xff0c;当答辩方结束答辩后&#xff0c;评…

【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析

文章目录 前言一、前提条件二、操作步骤2.1 准备云主机实例2.2 安装docker-compose2.3 使用docker-compose安装Superset2.3.1 克隆 Superset 的 GitHub 存储库2.3.2 通过 Docker Compose 启动 Superset 2.4 开通 OB Cloud 云数据库2.5 获取连接串2.6 使用 Superset 连接 OceanB…

打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet

一、引言 1.1 研究背景与意义 在现代医疗领域,医学影像作为疾病诊断与治疗的关键依据,发挥着不可替代的作用。从传统的X射线、CT(计算机断层扫描)到MRI(磁共振成像)等先进技术,医学影像能够直观呈现人体内部结构,为医生提供丰富的诊断信息,涵盖疾病识别、病灶定位、…

计算机缺失x3daudio1 7.dll怎么修复?

电脑运行时常见问题解析与修复策略&#xff1a;以“x3daudio1_7.dll缺失”为例 在软件开发与日常电脑维护的广阔领域中&#xff0c;我们时常会遇到各种系统报错和文件问题。这些问题不仅影响我们的工作效率&#xff0c;还可能对数据安全构成潜在威胁。作为一位经验丰富的软件开…

WPF区域导航+导航参数使用+路由守卫+导航日志

背景&#xff1a;使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的&#xff0c;不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel&#xff1a; private object body;public object Body {get { retu…

通过纯文字引导DeepSeek编写一个简单的聊天机器人~

为进一步验证DeepSeek的代码能力 和 自然语言理解力&#xff0c;我花费了大约1个半小时的时间&#xff0c;和DeepSeek仅通过文字对话&#xff0c;编写出一个简单的聊天机器人。 以下是最终运行效果、生成代码、引导沟通过程示例&#xff1a; 一、最终运行效果&#xff1a; 二…

C/C++中new/delete与malloc/free的区别及对象管理

C/C++中new/delete与malloc/free的区别及对象管理 在C/C++编程中,动态内存管理是一个核心且复杂的话题,其中new、delete、malloc和free是四个经常用于此目的的工具。尽管它们都涉及到内存的分配和释放,但它们在处理对象时的方式和效果却大相径庭。本文将通过示例来说明这些工…

安卓入门十一 常用网络协议四

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09; MQTT是一种轻量级的、发布/订阅模式的消息传输协议。它被设计用于在低带宽或不稳定网络环境下&#xff0c;实现物联网设备之间的可靠通信。 4.1 MQTT详细介绍 发布/订阅模式&#xff1a;MQTT 使用发布/订…

ansible-Ad-hoc命令行模式

一. 简述&#xff1a; ansible的ad-hoc是一个概念性的名字&#xff0c;是相对于ansible playbook而言。类似于&#xff1a;通过命令行来执行一些简单的&#xff0c;一次性的playbook任务(通俗点就是通过命令行执行一些简单的,而又不需要将命令特殊保存起来的任务)。Ansible提供…

UE5AI感知组件

官方解释&#xff1a; AI感知系统为Pawn提供了一种从环境中接收数据的方式&#xff0c;例如噪音的来源、AI是否遭到破坏、或AI是否看到了什么。 AI感知组件&#xff08;AIPerception Component&#xff09;是用于实现游戏中的非玩家角色&#xff08;NPC&#xff09;对环境和其…

[SAP ABAP] SMARTFORMS表单开发

使用事务码SMARTFORMS进入到SMARTFORMS开发界面进行表单开发 SMARTFORMS表单开发相关资料 [SMARTFORMS] 创建样式模板https://blog.csdn.net/Hudas/article/details/144946341?spm1001.2014.3001.5501[SMARTFORMS] 创建FORMhttps://blog.csdn.net/Hudas/article/details/144…

倍思氮化镓充电器分享:Super GaN伸缩线快充35W

快节奏的时代,在旅游、办公等场景下,一款高效、便捷的充电器可以让我们的生活更便捷、高效。今天就给大家推荐一款倍思氮化镓充电器——Super GaN伸缩线快充35W。它具备多重亮点,可以满足我们在许多场景下的充电需求,成为我们的得力助手。 倍思氮化镓Super GaN伸缩线快充35W的亮…

声音是如何产生的

一、音频概述 RTMP中一般音频采用aac编码&#xff0c;采样率为44100HZ, 每帧1024采样&#xff0c;帧率43&#xff0c;23.2ms一帧 RTC中一般音频采用opus编码&#xff0c;采样率为48000HZ&#xff0c;每帧480采样&#xff0c;帧率100&#xff0c;10ms一帧 通道数&#xff08;c…