行为型模式 - 状态模式State

2023-11-17

状态模式的定义与特点

     状态(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();
        }
    }
}


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

行为型模式 - 状态模式State 的相关文章

  • 状态设计模式

    目录 前言 状态机原理 状态机的实现方式一 分支逻辑法 状态机实现方式二 查表法 状态机实现方式三 状态模式 总结 参考资料 前言 在实际的软件开发中 状态模式并不是很常见 但是在能够用到的场景里 可以发挥比较大的作用 状态模式一般用来实现
  • SpringBootWeb登录认证

    登录服务端的核心逻辑就是 接收前端请求传递的 用户名 和 密码 然后再根据用户名和密码查询用户信息 如果用户信息存在 则说明用户输入的用户名和密码正确 如果查询到的用户不存在 则说明用户输入的用户名和密码错误 统一拦截 可以使用两种技术实现
  • C++状态模式:State Pattern

    状态模式 允许对象在其内部状态改变时改变它的行为 对象看起来好像修改类它的类 状态模式是有限状态机 Finite State Machine 的一种实现方式 我们都知道 http请求报文由请求行 请求头 请求空行和请求体四部分组成 服务器在
  • Head First Design Mode(12)-状态模式

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 状态模式 状态模式和策略模式是 双胞胎 在出生时才分开 策略模式是围绕可以互换的算法来创建成功业务的 状态模式则是通过改变对象内部的状态来帮助对象控制自己的行为 状态
  • 设计模式学习(五):State状态模式

    目录 一 什么是State模式 二 State模式示例程序 2 1 伪代码 2 1 1 不使用State模式的伪代码 2 1 2 使用State模式的伪代码 2 2 各个类之间的关系 2 3 State接口 2 4 DayState类 2
  • Sping Security前后端分离两种方案

    前言 本篇文章是基于Spring Security实现前后端分离登录认证及权限控制的实战 主要包括以下四方面内容 Spring Seciruty简单介绍 通过Spring Seciruty实现的基于表单和Token认证的两种认证方式 自定义
  • 软件设计模式(一)

    本章学习主要参照Datawhale开源学习及 大话设计模式 本项目结合 大话设计模式 这本书 总结了各种设计模式的基本概念 知识点和适用场景 先通过书中的案例 介绍了23种设计模式及其相关的代码示例 项目中有多种语言代码示例 本文主要采用P
  • 【计算机基础知识9】前端设计模式与常见类型

    目录 一 前言 二 设计模式的基本概念和原则 三 创建型设计模式 四 结构型设计模式 五 行为型设计模式 六 MVC和MVVM框架中的设计模式 七 实际应用案例分析 一 前言 在软件开发领域 设计模式是一种解决常见问题的最佳实践 它可以帮助
  • 登录和注册页面 - 验证码功能的实现

    目录 1 生成验证码 2 将本地验证码发布成 URL 3 后端返回验证码的 URL 给前端 4 前端将用户输入的验证码传给后端 5 后端验证验证码 1 生成验证码 使用hutool 工具生成验证码 1 1 添加 hutool 验证码依赖
  • springboot封装响应实体

    前言 首先什么是响应实体 正常我们的后端都是接收前端 然后把请求需要的数据返回给前端 而这个返回的数据就是我们的响应实体 那么 为什么我们需要进行封装响应实体呢 第一点 最明显的就是 为了人机友好交互 如果单单只是把返回的数据给到前端 有数
  • java设计模式——状态模式(State Pattern)

    概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题 当系统中某个对象存在多个状态 这些状态之间可以进行转换 而且对象在不同状态下行为不相同时可以使用状态模式 状态模式将一个对象的状态从该对象中分离出来 封装到专门的状
  • Java设计模式-状态模式

    1 概述 定义 对有状态的对象 把复杂的 判断逻辑 提取到不同的状态对象中 允许状态对象在其内部状态发生改变时改变其行为 例 通过按钮来控制一个电梯的状态 一个电梯有开门状态 关门状态 停止状态 运行状态 每一种状态改变 都有可能要根据其他
  • 动态代理原理和设计模式详解

    一 什么是代理模式代理模式是一种设计模式 提供了对目标对象额外的访问方式 即可以通过代理访问目标对象 这样可以在不修改原目标对象的前提下 提供额外的方式进行访问 扩展目标对象的功能 通俗的说 例如你想租房 房子就是你的目标访问对象 那在中间
  • 【GOF23设计模式】_状态模式_UML状态图_酒店系统房间状态_线程对象状态切换JAVA250

    来源 http www bjsxt com 一 S03E250 01 GOF23设计模式 状态模式 UML状态图 酒店系统房间状态 线程对象状态切换 package com test state public interface State
  • 设计模式【15】——状态模式(State模式)

    文章目录 前言 一 状态模式 State模式 二 具体源码 1 State h 2 State cpp 3 Context h 4 Context cpp 5 main cpp 三 运行结果 总结 前言 每个人 事物在不同的状态下会有不同表
  • 【面试题】前端开发中如何高效渲染大数据量?

    前端面试题库 面试必备 推荐 地址 前端面试题库 国庆头像 国庆爱国 程序员头像 总有一款适合你 在日常工作中 较少的能遇到一次性往页面中插入大量数据的场景 数栈的离线开发 以下简称离线 产品中 就有类似的场景 本文将分享一个实际场景中的前
  • Springmvc之JSR303和拦截器

    JSR303 拦截器 1 JSR303 什么是JSR303 JSR是Java Specification Requests的缩写 意思是Java 规范提案 是指向JCP Java Community Process 提出新增一个标准化技术规
  • 【设计模式】用Java实现状态模式

    一 状态模式介绍与使用场景 状态模式是一种行为设计模式 它允许对象在内部状态发生改变时改变其行为 该模式将对象的行为包装在不同的状态类中 使得对象的行为可以根据其当前状态动态改变 状态模式通常由以下几个角色组成 环境类 Context 环境
  • 行为型模式-状态模式

    package per mjn pattern state after 环境角色类 public class Context 定义对应状态对象的常量 public final static OpeningState OPENING STAT
  • 如何利用Requestly提升前端开发与测试的效率

    前端测试 在进行前端页面开发或者测试的时候 我们会遇到这一类场景 在开发阶段 前端想通过调用真实的接口返回响应 在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时 在测试阶段 想直接通过修改接口响应来验证前端页面是否正常

随机推荐

  • 数学:凸包算法详解

    一 概念 凸包 Convex Hull 是一个计算几何 图形学 中的概念 在一个实数向量空间V中 对于给定集合X 所有包含X的凸集的交集S被称为X的凸包 X的凸包可以用X内所有点 X1 Xn 的线性组合来构造 在二维欧几里得空间中 凸包可想
  • 海思芯片(hi3516dv300)uboot镜像生成过程详解

    1 前言 1 本文介绍的uboot编译过程是基于海思提供SDK包里的uboot源码进行编译 具体的编译参数是根据hi3516dv300芯片来设置的 编译生成的uboot烧录镜像也是用于hi3516dv300芯片的uboot镜像 2 对于Ma
  • 4.1 独立键盘检测

    题目 用数码管的前两位显示一个十进制的数 00 59变化 开始显示00 每按下S2键一次 数值加1 每按下S3键一次 数值减1 每按下S4键一次数值归零 按下S5键一次 利用定时器功能使数值开始自动每秒加1 再按下S5键 数值停止自动加1
  • Sqlite研究系列-1

    文章目录 简介 架构 简介 sqlite是一个开源的嵌入式关系型数据库 与常规数据库不同的地方是 零配置 没有账号概念 客户端和服务端运行在应用程序的进程空间 不需要网络配置 sqlite可以编译到应用程序中 依赖于文件系统 占用资源少 支
  • mpu6050数据实时发布到mqtt服务器

    vcc 5V SDA i2c数据 pin3 SDL i2c时钟 pin5 GND import smbus import SMBus module of I2C import time import math import json imp
  • 顺序表插入元素

    顺序表在插入元素时应注意 1 插入元素不可以插在最后一个位置 2 插入元素不可以插在超过顺序表的长度 代码实现 include
  • iOS下XMPP开发之XMPP开发环境配置(二)mac上搭建openfire服务器

    一 下载并安装openfire 1 到http www igniterealtime org downloads index jsp下载最新openfire for mac版 比如 Openfire 3 8 1 下载后的文件 openfir
  • XSS跨站脚本攻击(一)----XSS攻击的三种类型

    一 简介 什么是XSS 百度百科的解释 XSS又叫CSS Cross Site Script 跨站脚本攻击 它指的是恶意攻击者往Web页面里插入恶意html代码 当用户浏览该页之时 嵌入其中Web里面的html代码会被执行 从而达到恶意用户
  • gitlab项目代码仓库管理指南(自用)

    gitlab项目管理流程 注意事项 任何项目开始即创建对应项目仓库 issues应覆盖项目从原始需求 gt 项目结题过程中各环节 记录问题 解决思路等 及时整理 及时归档 流程图 git常用命令图 创建项目团队 注意事项 正式项目应所属团队
  • 相似性度量总结

    整理自 机器学习中的相似性度量 余弦距离 欧氏距离和杰卡德相似性度量的对比分析 在做分类时常常需要估算不同样本之间的相似性度量 Similarity Measurement 这时通常采用的方法就是计算样本间的 距离 Distance 采用什
  • VS2017突然不检查语法错误

    VS2017用着用着不检查语法错误 生成只说失败 错误列表显示0 只需要退出软件 到工程目录中删除 vs文件夹 重启软件即可 VS2019也是一样的
  • 关于https://goproxy.cn,direct与https://proxy.golang.org的问题,国内无法访问https://proxy.golang.org设置了GOPROXY仍不可行

    关于https goproxy cn direct与https proxy golang org的问题 国内无法访问https proxy golang org设置了GOPROXY仍不可行 一步一步说 首先 遇到报错信息 go github
  • NLP基础知识点:BLEU(及Python代码实现)

    Bleu 1 是IBM在2002提出的 用于机器翻译任务的评价 BLEU还有许多变种 根据n gram可以划分成多种评价指标 常见的指标有BLEU 1 BLEU 2 BLEU 3 BLEU 4四种 其中n gram指的是连续的单词个数为n
  • 校招真题练习008 浇花(百度)

    浇花 题目描述一个花坛中有很多花和两个喷泉 喷泉可以浇到以自己为中心 半径为r的圆内的所有范围的花 现在给出这些花的坐标和两个喷泉的坐标 要求你安排两个喷泉浇花的半径r1和r2 使得所有的花都能被浇到的同时 r1 2 r2 2 的值最小 输
  • GCC编译优化应用预编译头

    服务器编译优化记录 对项目编译优化过程中一些思路和脚本工具实现 对内存受限的编译环境有一些帮助 工具 https github com wangxiaobai dd GccPrecompiledHeader 环境 32G内存 16核 Mak
  • 入职华为外包一个月,我离职了

    我入职华为外包公司已经有一个月了 一开始我对这份工作充满了期待和热情 毕竟 华为是一家全球知名的科技公司 而我也有机会成为其中的一员 我相信这份工作会给我带来许多机遇和挑战 然而 随着时间的推移 我开始发现外包公司的工作条件并不如我所想象的
  • 指标实现层级_有了指标怎么用层次分析法建立模型?

    电脑 MATLAB软件 方法 步骤 建立层次结构模型 目标层 这一层次中只有一个元素 一般它是分析问题的预定目标或理想结果 因此也称为目标层 准则层 这一层次中包含了为实现目标所涉及的中间环节 它可以由若干个层次组成 包括所需考虑的准则 子
  • TQ210学习笔记:TQ210移植qt

    这几天搞了一块TQ210的板子 由于要求 需要移植qt进去 于是搞了近一个星期 现在终于看到了一点希望 开始找了一篇博客 我是按照他的步骤来 http emouse cnblogs com 首先是移植TSLIB 移植这个的原因是 因为电磁噪
  • C++进阶--对象指针

    对象指针定义形式 类名 对象指针名 例 Point a 5 10 Point ptr ptr a 通过指针访问对象成员 对象指针名 gt 成员名 例 ptr gt getx 就相当于 ptr getx this指针 隐含于类的每一个非静态成
  • 行为型模式 - 状态模式State

    状态模式的定义与特点 状态 State 模式的定义 对有状态的对象 把复杂的 判断逻辑 提取到不同的状态对象中 允许状态对象在其内部状态发生改变时改变其行为 状态模式是一种对象行为型模式 其主要优点如下 结构清晰 状态模式将与特定状态相关的