行为型模式 - 状态模式State

news2024/11/15 13:41:24

状态模式的定义与特点

     状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。  

状态模式是一种对象行为型模式,其主要优点如下。

  • 结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。
  • 将状态转换显示化,减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。
  • 状态类职责明确,有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。

状态模式的主要缺点如下。

  • 状态模式的使用必然会增加系统的类与对象的个数。
  • 状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
  • 状态模式对开闭原则的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源码,否则无法切换到新增状态,而且修改某个状态类的行为也需要修改对应类的源码。

状态模式的结构与实现

      状态模式把受环境改变的对象行为包装在不同的状态对象里,其意图是让一个对象在其内部状态改变的时候,其行为也随之改变。现在我们来分析其基本结构和实现方法。  

1. 状态模式的结构

状态模式包含以下主要角色。

  1. 环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。
  2. 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
  3. 具体状态(Concrete State)角色:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。

其结构图如图 1 所示。  

图1

using DesignPattern.StatePattern;
using System;

namespace DesignPattern
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StateHelper();
        }

        #region Pattern - State
        static void StateHelper()
        {
            StateModelA stateA = new StateModelA();
            StateModelB stateB = new StateModelB();
            StateController controller = new StateController(stateA);
            controller.Enter();
            controller.Change(stateB);
            controller.Exit();

            Console.ReadLine();
        }
        #endregion
    }
}

//======================================================================================

namespace DesignPattern.StatePattern
{
    public abstract class StateModel
    {
        public abstract void Enter();
        public abstract void Exit();
    }

    public class StateModelA : StateModel
    {
        public override void Enter()
        {
            Console.WriteLine("进入 A 状态.");
        }

        public override void Exit()
        {
            Console.WriteLine("离开 A 状态.");
        }
    }

    public class StateModelB : StateModel
    {
        public override void Enter()
        {
            Console.WriteLine("进入 B 状态.");
        }

        public override void Exit()
        {
            Console.WriteLine("离开 B 状态.");
        }
    }

    public class StateController
    {
        private StateModel state;

        public StateController(StateModel state)
        {
            this.state = state;
        }

        public void Enter()
        {
            state.Enter();
        }

        public void Change(StateModel state)
        {
            this.state.Exit();
            this.state = state;
            this.state.Enter();
        }

        public void Exit()
        {
            state.Exit();
        }
    }
}


希望大家:点赞,留言,关注咯~    
😘😘😘😘

唠家常

今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们😄

今日推荐

  • 博客杂货铺
  • GoF23 种设计模式的分类和功能

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

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

相关文章

Oracle用户权限管理

一、运行企业管理器 管理员身份运行客户端的企业管理器 首次打开需要添加数据库信息,这里使用已经存在的数据库orcl 使用系统用户登录 用户名:system,口令orcl 或者不输入使用SYSDBA登录 可以查看所有用户的详细信息: 用户名, 账户状态,…

union和union all 的区别

1:union用于合并两个或多个select 语句的结果集。 注意: 1:union内部的select 语句必需拥有相同数量的列,列也夜必须拥有相似的数据类型,同时每条select 语句中的列的顺序必须相同。 2:union结果集中的列…

JVM垃圾回收与性能调优策略

一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参…

项目代码版本控制与保护

一、版本命名规则 1.1 需求开发分支命名规则 格式:dev_v版本号_需求名称 案例:dev_v01.31_TX202301141 dev_v01.31_数字产品平台订单查询优化 1.2 测试环境发布分支命名规则 格式:uat_deploy 1.3 预上环境分支命名规则 格式&#xff1a…

Apsara Clouder云计算专项技能认证:云服务器ECS入门

文章目录 一、什么是云服务器ECS二、如何获取一台云服务器ECS三、5分钟学会管理云服务器ECS四、【实验】ECS云服务器新手上路五、【实验】基于ECS搭建云上博客入口: https://edu.aliyun.com/certification/cldc15 一、什么是云服务器ECS

8K超高清企业获广东省专精特新称号,背后意味着什么?

2023年开年之际,广州博冠光电科技股份有限公司及其子公司广州博冠智能科技有限公司通过“2022年广东省专精特新中小企业”和“2022年广东省名优高新技术产品”2项权威认定荣誉。广东省“专精特新”认定是什么?“专精特新”是指中小企业具备专业化、精细化…

github入门指南

文章目录什么是开源开源项目托管平台github使用介绍什么是github使用github(1)注册(2)创建远程仓库(3)github功能介绍本地创建仓库与远程仓库进行关联什么是开源 开源,即开放源代码&#xff0c…

呆头鹅批量剪辑视频软件:玩的就是裂变,剪辑需求者的终身助理

文案来自于公众号:生财风暴 图片来自于公众号:生财风暴 随着5G时代到来,短视频,电商,自媒体等平台全面崛起,目前影视制作行业前景的9字真言: 需求大!门槛低!薪资高! 呆头…

迟来的年度总结 —— 我与 csdn 的故事

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:我的故事 文章目录引子我的大一我与 csdn 的相识第一次创作喜悦 —— 干劲满满挫败 —— 厚积薄发意外 —— 收获果实博客新星陪伴社区与StackFrame…

修改 bootargs 方式增加分区(mtd分区和blkdevparts分区)

1、Linux内核设置分区的两种方式 1.1、内核代码中写死 在内核的平台代码中写死,然后在初始化NandFlash的时候设置。 1.2、uboot通过bootargs传递分区表 (1)u-boot将分区信息(形如:mtdpartsxxx,blkdevpartsxxx)添加到b…

​力扣解法汇总2325. 解密消息

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你字符串 key 和 message ,分别表示一个加密密钥和一段加密消息。…

FastDeploy全场景高性能AI部署工具:加速打通AI模型产业落地的最后一公里

飞桨目前为开发者提供了涵盖多种领域的模型套件,开发者可以使用这些套件基于自身数据集快速完成深度学习模型的训练。但在实际产业部署环境下,开发者在部署模型到不同硬件和不同场景时面临以下三个痛点问题。 碎片化。在部署过程中,由于深度学…

投资中的不可能三角

投资中避不开这个不可能三角! 而这“三个角”指的是高收益、低风险、高流动性,“不可能三角”则指的是“三角”难以同时满足。 因为这三角的关系是相互制衡的! ①若要追求较低风险条件下的较高收益,需要以时间换取空间&#xff0…

认识现有的频谱监测方案

摘要随着频谱监测行业的不断发展,频谱仪已经不仅局限于频谱监测与获取,随着5G的逐渐普及,在垂直领域的各种应用中都有其价值。针对不同的应用场景与行业,现有的市场上主要存在三种频谱监测方案,我们将在本文中进行总结…

【AI-NLP】Transformer浅记

文章目录提出背景总体结构EncoderDecoder细节再探源码阅读主函数部分主模型定义参考资料提出背景 改进了RNN的训练慢的缺点,利用self-attention机制实现并行计算。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确…

2022 IoTDB Summit:中冶赛迪工业互联网平台与CISDigital-TimeS(基于IoTDB)在钢铁行业的实践...

12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

即时通讯开发之详解TCP/IP中的DNS 域名系统

前面已经提到了访问一台机器要靠 IP 地址和 MAC 地址,其中,MAC 地址可以通过 ARP 协议得到,所以这对用户是透明的,但是 IP 地址就不行,无论如何用户都需要用一个指定的 IP 来访问一台计算机,而 IP 地址又非常不好记,于是就出现了 DNS 系统。DNS 系统介绍DNS 的全称是 Domain Na…

MYSQL作业

MySQL 作业一、填空题 1、交叉连接查询返回的结果是被连接的两张数据表中所有数据行的_笛卡尔积___ 。2、左连接查询的结果包括 LEFT JOIN 子句中左表的_所有记录___,以及右表中满足连接条件的记录。3、内连接查询的语法中,ON 用于指定查询的__匹配条件_…

从0开始学python -16

Python3 列表-1 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。 Python 有 6 个序列的内置类型,但最常见的是列表和元组。 列表都可以…