乐在其中设计模式(C#) - 状态模式(State Pattern)

C# 设计模式:第二十二章 - 行为型模式 之 状态模式(State Pattern) 状态模式是一种行为型设计模式,它允许你根据对象的当前状态来改变其行为。状态模式的核心思想是通过将对象的不同状态封装到独立的类中,每个状态类负责处理该状态下对象的行为。当对象的状态发生变化时,它会切换到相应的状态类,从而改变其行为。通过这种方式,你可以避免使用大量的if-else或switch语句来判断对象的状态,从而使代码更加简洁、灵活和可维护。在这章中,我们学习了状态模式的基本概念、应用场景、实现方法以及注意事项。状态模式允许你根据对象的当前状态来改变其行为。自动售货机。 阅读详情
[索引页]
[源码下载]


乐在其中设计模式(C#) - 状态模式(State Pattern)


作者: webabcd


介绍
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。


示例
有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里。在对象内部可以根据用户的不同选择不同的数据持久化方案。



MessageModel
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.State
{
    
/// <summary>
    
/// Message实体类
    
/// </summary>

    public class MessageModel
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="msg">Message内容</param>
        
/// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)
        
{
            
this._message = msg;
            
this._publishTime = pt;
        }


        
private string _message;
        
/// <summary>
        
/// Message内容
        
/// </summary>

        public string Message
        
{
            
get { return _message; }
            
set { _message = value; }
        }


        
private DateTime _publishTime;
        
/// <summary>
        
/// Message发布时间
        
/// </summary>

        public DateTime PublishTime
        
{
            
get { return _publishTime; }
            
set { _publishTime = value; }
        }

    }

}


AbstractMessageState
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.State
{
    
/// <summary>
    
/// 状态模式抽象类
    
/// </summary>

    public abstract class AbstractMessageState
    
{
        
/// <summary>
        
/// Context类型
        
/// </summary>

        protected Message _message;

        
/// <summary>
        
/// Context类型属性
        
/// </summary>

        public Message Message
        
{
            
get { return _message; }
            
set { _message = value; }
        }


        
/// <summary>
        
/// 改变状态
        
/// </summary>

        public abstract void StateChangeCheck();

        
/// <summary>
        
/// 获取Message
        
/// </summary>
        
/// <returns></returns>

        public abstract List<MessageModel> Get();

        
/// <summary>
        
/// 插入Message
        
/// </summary>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public abstract bool Insert(MessageModel mm);
    }

}


XmlMessage
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.State
{
    
/// <summary>
    
/// Xml方式操作Message
    
/// </summary>

    public class XmlMessage : AbstractMessageState
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="message">Context类型参数</param>

        public XmlMessage(Message message)
        
{
            
this._message = message;
        }


        
/// <summary>
        
/// 改变状态
        
/// </summary>

        public override void StateChangeCheck()
        
{
            
// 如果UserId是admin则变换状态为SqlMessage
            if (this._message.UserId == "admin")
            
{
                
this._message.AbstractMessageState = new SqlMessage(this._message);
            }

        }


        
/// <summary>
        
/// 获取Message
        
/// </summary>
        
/// <returns></returns>

        public override List<MessageModel> Get()
        
{
            List
<MessageModel> l = new List<MessageModel>();
            l.Add(
new MessageModel("XML方式获取Message", DateTime.Now));

            
return l;
        }


        
/// <summary>
        
/// 插入Message
        
/// </summary>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public override bool Insert(MessageModel mm)
        
{
            
// 代码略
            return true;
        }

    }

}


SqlMessage
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.State
{
    
/// <summary>
    
/// Sql方式操作Message
    
/// </summary>

    public class SqlMessage : AbstractMessageState
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="message">Context类型参数</param>

        public SqlMessage(Message message)
        
{
            
this._message = message;
        }


        
/// <summary>
        
/// 改变状态
        
/// </summary>

        public override void StateChangeCheck()
        
{

        }


        
/// <summary>
        
/// 获取Message
        
/// </summary>
        
/// <returns></returns>

        public override List<MessageModel> Get()
        
{
            List
<MessageModel> l = new List<MessageModel>();
            l.Add(
new MessageModel("SQL方式获取Message", DateTime.Now));

            
return l;
        }


        
/// <summary>
        
/// 插入Message
        
/// </summary>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public override bool Insert(MessageModel mm)
        
{
            
// 代码略
            return true;
        }

    }

}


Message
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.State
{
    
/// <summary>
    
/// Context类
    
/// </summary>

    public class Message
    
{
        
/// <summary>
        
/// 类型为状态模式抽象类的私有变量
        
/// </summary>

        private AbstractMessageState _abstractMessageState;

        
/// <summary>
        
/// 类型为状态模式抽象类的属性
        
/// </summary>

        public AbstractMessageState AbstractMessageState
        
{
            
get { return _abstractMessageState; }
            
set { _abstractMessageState = value; }
        }
       

        
/// <summary>
        
/// UserId私有变量
        
/// </summary>

        private string _userId;

        
/// <summary>
        
/// UserId
        
/// </summary>

        public string UserId
        
{
            
get { return _userId; }
            
set { _userId = value; }
        }


        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="userId">UserId</param>

        public Message(string userId)
        
{
            
this._userId = userId;

            _abstractMessageState 
= new XmlMessage(this);
        }


        
/// <summary>
        
/// 获取Message
        
/// </summary>
        
/// <returns></returns>

        public List<MessageModel> Get()
        
{
            
// 修改状态
            _abstractMessageState.StateChangeCheck();

            
return _abstractMessageState.Get();
        }


        
/// <summary>
        
/// 插入Message
        
/// </summary>
        
/// <param name="mm">Message实体对象</param>
        
/// <returns></returns>

        public bool Insert(MessageModel mm)
        
{
            
// 修改状态
            _abstractMessageState.StateChangeCheck();

            
return _abstractMessageState.Insert(mm);
        }

    }

}



client
using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  Pattern.State;

public  partial  class  State : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        Message m 
= new Message("admin");
        Response.Write(m.Insert(
new MessageModel("插入", DateTime.Now)));
        Response.Write(
"<br />");
        Response.Write(m.Get()[
0].Message + " " + m.Get()[0].PublishTime.ToString());
        Response.Write(
"<br />");

        m 
= new Message("user");
        Response.Write(m.Insert(
new MessageModel("插入", DateTime.Now)));
        Response.Write(
"<br />");
        Response.Write(m.Get()[
0].Message + " " + m.Get()[0].PublishTime.ToString());
        Response.Write(
"<br />");
    }

}


运行结果
True
SQL方式获取Message 2007-3-6 22:58:17
True
XML方式获取Message 2007-3-6 22:58:17


参考
http://www.dofactory.com/Patterns/PatternState.aspx


OK
[源码下载]
C# 设计模式:状态模式(State Pattern) 通过以上的步骤,你现在可以使用状态模式来实现一个简单的交通信号灯状态变化了。状态模式不仅可以简化复杂的条件判断逻辑,还可以提高代码的可扩展性和可维护性。 阅读详情

相关推荐

【愚公系列】二十三种设计模式(二十)-状态模式(State Pattern)

设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。

愚公智库 47万+

设计模式 -- 状态模式

状态模式是一种行为型设计模式,它允许对象在其内部状态发生变化时改变其行为。状态模式将状态和状态对应的行为封装在不同的类中,使得状态可以独立于对象而变化状态模式的应用场景:订单状态管理:订单状态随着订单的不同阶段不断变化,可以使用状态模式来管理订单状态的转换。游戏角色状态管理:游戏中的角色状态也会随着游戏进程不断变化,可以使用状态模式来管理角色状态的转换。线程状态管理:线程的状态也会随着线程的运行状态不断变化,可以使用状态模式来管理线程状态的转换。

w5_Silence的博客 1025

STM32 无线充电接收端硬件设计:从 LC 谐振到 PWM 控制的 5 大关键电路解析

本文深入解析了基于STM32的无线充电接收端硬件设计,重点探讨了LC谐振倍压整流、INA282电流采样、IR2104S半桥驱动、超级电容保护及STM32最小系统等5大关键电路。针对超级电容的恒功率充电需求,详细介绍了PID控制算法优化及PCB设计实战要点,帮助工程师提升无线充电系统的效率和可靠性。

weixin_31774841的博客 384

如何在.Net中使用状态设计模式

设计模式用于解决常见的设计问题并减少源代码中的复杂性。 状态设计模式是一种行为模式,用于表示对象之间的一对多关系,使得如果修改了一个对象,那么所有从属对象也将被修改。 四人帮定义状态设计模式如下: 当对象的内部状态更改时,允许其更改其行为。 该对象似乎将更改其类。 本文讨论了如何在.Net中使用状态设计模式。 [Git要点: Git版本控制入门 。 • Git和GitHub的2...

cxu0262的博客 173

Win11系统下Abaqus2022与VS2022+oneAPI2023环境配置全攻略(附VUMAT子程序避坑指南)

本文详细指导在Windows 11系统下,为Abaqus 2022配置Visual Studio 2022与Intel oneAPI 2023的Fortran编译环境,以支持VUMAT等用户子程序开发。内容涵盖软件安装顺序、环境变量关联、快捷方式修改及关键验证步骤,并提供了首个VUMAT子程序的实战编写与模型验证方法,帮助用户高效搭建稳定可靠的仿真开发平台。

pytorch8learner的博客 316

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

A20802013的博客 2万+

【23种设计模式】之状态模式(State Pattern) .Net Core实现

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 613

CocosCreator视频播放黑屏?手把手教你封装VideoPlayer组件解决Web环境问题

本文针对Cocos Creator在Web环境下视频播放黑屏等常见问题,提供了一套工程化的VideoPlayer组件封装解决方案。文章深入剖析了浏览器自动播放策略、DOM样式隔离等核心挑战,并手把手教你实现一个健壮的管理器,涵盖兼容性处理、性能优化与内存管理,确保视频播放稳定流畅。

plum99的博客 598

.NET 开发中最常用的设计模式

设计模式是软件开发人员在开发过程中面临的常见问题的一组最佳实践和解决方案。这些模式通常是可重用的,并且可以应用于不同的项目。设计模式不是语言功能或库,而是一种组织代码以使其更易于维护、可扩展和可重用的方式。它们通常分为三种类型:创造模式、结构模式和行为模式。创建模式处理对象创建机制,尝试以适合情况的方式创建对象。结构模式处理对象组成,行为模式处理对象之间的通信。

学以致用 知行合一 3128

解决usbisp不识别无法烧录Atmega328P,Arduino不识别问题

如果使用Arduino IDE里面的烧录,可能会遇到一个问题,就是不识别国产这种廉价的USBISP 点击烧录引导程序,会遭遇到找不到USB设备的问题,选哪个都会提示找不到,比如选择USBasp could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp' 因此,我们需要使用到progisp这一个软件的1.72版本 选择好芯片的型号后,调用编译好的HEX文...

arenascat的博客 7436

Python办公自动化 2.1开发环境搭建:PyCharm社区版配置Anaconda开发环境

本篇文章主要讲述了如何在windows主机上配置 PyCharm + Anaconda开发环境、以及了如何配置 PyQt界面开发环境,安装过程超级详细,初学者可以照着一步一步来!

超级大洋葱的博客 2584

设计模式 状态机

本文梳理状态机概念,在实操中状态机和类似,只是被封装起来,可以很方便的实现状态初始化和状态转换。

baiiu 1926

YOLOv9分割训练自己数据和推理训练好模型,并教你使用Labelme工具标注数据(附YOLOv9分割模型结构图),全网最详细教程

YOLOv9 通过研究数据传输时的信息丢失问题,提出了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)架构,提高了参数利用率和模型性能。与 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。PGI 适用于从轻型到大型的各种模型,使从头开始训练的模型能够获得更好的结果。YOLOv9 被评价为新的 SOTA 实时目标检测器。接下来本文手把手教你训练自己分割数据集和推理训练好的分割模型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1491

设计模式24:State Pattern (状态模式)

英文原文:http://www.dofactory.com/Patterns/PatternState.aspx一、State Pattern (状态模式)Define: Allow an object to alter its behavior when its internal state changes. The object will appear to change its cl

薛敬明的专栏 1897

知识追踪实战:lstm+ Multi-head Attention注意力机制的学生做题成绩预测实战

知识追踪实战:lstm+ Multi-head Attention注意力机制的学生做题成绩预测实战

2221

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

状态模式(State Pattern)

设计模式 - 吕震宇 .NET设计模式系列文章 薛敬明的专栏 乐在其中设计模式(C#) 设计模式24:State Pattern (状态模式) 英文原文:http://www.dofactory.com/Patterns/PatternState.aspx 一、State Pattern (状态模式) Define: Allow an object to alter

jiangxinyu的专栏 2313

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【C#设计模式】18.状态模式(State Pattern)【行为型】

1.1 动机(Motivate) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合? 1.2 意图(Intent) 允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。       ——《设计模式》GoF ......

星Yeah 的博客 2115

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C#设计模式读书笔记之状态模式(State Pattern)

状态模式(State pattern)【使用频率:★★★☆☆】 1.概述:允许一个对象在其内部状态改变时改变它的行为。 2.解决的问题:主要解决的是当控制一个对象状态转换的条件过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑判断简单化。 3.模式中的角色   3.1上下文环境(Context):在Context类中维护一个抽象状态类State的实例,这个...

qq826364410的专栏 528

设计模式 状态模式(State Pattern)

状态模式(State Pattern)flyfish#include "stdafx.h" #include class role; class employee { public: virtual void output(role *role_ptr) = 0;};class engineer : public employee {public: virtua

二分掌柜的 837

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

首先,定义一个状态接口,所有具体的状态类都将实现这个接口。上下文类维护一个对当前状态的引用,并提供一个方法来改变状态。状态机模式通过将状态和行为分离,使得状态之间的转换更加清晰和可控。虽然它会增加一些代码量,但在处理复杂状态管理和状态转换时,其优点是非常明显的。

仰望星空的人 1036

设计模式(十一)————状态模式(State Pattern)

定义:允许一个对象在其内部状态发生改变时改变他的行为。对象看起来似乎修改了它的类。(类的行为是基于它的状态改变的,使用状态模式可以有效解决代码中if-else和switch的case太多的问题,使代码更容易维护) UML类图: C++实现: #include<iostream> #include<string> using namespace std; cla...

chczy1的博客 170
上一篇: [翻译]开发一个自己的HTML在线编辑器(二)
下一篇: [翻译]asp.net 2.0中页的生存周期(Lifecycle)和动态控件
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值