设计模式-状态模式(State Pattern)结构|原理|优缺点|场景|示例

                                     设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式    


状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。这种模式主要用于当一个对象的行为依赖于它的状态(即内部状态),并且它必须在运行时根据状态改变它的行为时。

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

  1. Context(环境类/上下文):定义了客户感兴趣的接口,并维护一个具体状态对象的引用,将与状态相关的操作委托给当前状态对象处理。
  2. State(抽象状态类):定义一个接口,用以封装使用上下文环境的各个状态所对应的行为。
  3. ConcreteState(具体状态类):实现抽象状态类定义的接口,每一个具体状态类对应上下文的一个具体状态,负责实现该状态下对应的行为。

原理:

  • 上下文对象持有一个状态对象的引用,这个状态对象决定了上下文对象的行为。
  • 当上下文对象的内部状态改变时,它会改变所持有的状态对象,从而改变其行为。
  • 上下文对象不需要知道具体状态类的细节,只需要通过抽象状态类的接口与状态对象交互。

优缺点: 优点:

  • 结构清晰,将状态相关的代码组织在一起,符合单一职责原则。
  • 将状态转换的逻辑封装在状态类中,使得状态转换逻辑与上下文对象分离,易于扩展新的状态和转换逻辑。
  • 提高了对象的可扩展性和可维护性。

缺点:

  • 如果状态过多,会导致类的个数增加,系统复杂度上升。
  • 状态模式的使用需要合理判断,避免过度设计。

应用场景:

  • UI控件的状态变化,如按钮的禁用/启用状态。
  • 状态机的实现,如ATM机的不同操作状态。
  • 工作流系统,如订单处理的不同阶段。

代码示例(以Java为例)

// 抽象状态类
interface PlayerState {void play();void stop();void pause();
}// 具体状态类:播放状态
class PlayingState implements PlayerState {@Overridepublic void play() {System.out.println("Already playing.");}@Overridepublic void stop() {System.out.println("Stopping the player.");}@Overridepublic void pause() {System.out.println("Pausing the player.");// 可能会在这里切换到暂停状态(PauseState)}
}// 具体状态类:暂停状态
class PausedState implements PlayerState {@Overridepublic void play() {System.out.println("Resuming the player.");}@Overridepublic void stop() {System.out.println("Stopping the player.");}@Overridepublic void pause() {System.out.println("Player is already paused.");}
}// 上下文类:播放器
class MediaPlayer {private PlayerState state;public MediaPlayer() {this.state = new StoppedState(); // 初始状态设为停止状态}public void setState(PlayerState state) {this.state = state;}public void play() {state.play();}public void stop() {state.stop();}public void pause() {state.pause();}
}// 示例使用
public class StatePatternDemo {public static void main(String[] args) {MediaPlayer player = new MediaPlayer();player.play(); // 输出:Starting the player.player.pause(); // 输出:Pausing the player.player.stop(); // 输出:Stopping the player.}
}

        在这个例子中,MediaPlayer是上下文,它维护了一个PlayerState的实例,通过调用play()stop()pause()等方法,实际上是由当前状态对象决定具体的行为。随着状态的改变,播放器的行为也会相应变化。

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

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

相关文章

Go 语言基础(二)【数组、切片、指针、map、struct】

1、数组 特别需要注意的是:在 Go 语言中,数组长度也是数组类型的一部分!所以尽管元素类型相同但是长度不同的两个数组,它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

ArrayList知识点详解

目录 1.简介 2.ArrayList的使用 (1)如何实例化ArrayList?(如何创建?) (2)如何构造使用? (3)为什么ArrayList的无参构造可以添加数据 &#…

引用参数的不同种类

1. 示例一 #include <iostream> #include <string>struct Obj{Obj(){std::cout << "Ctor called.\n";}Obj(const Obj&){std::cout << "Copy ctor called.\n"; }~Obj(){std::cout << "Dtor called.\n";} }…

rust疑难杂症

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…

深入理解多层感知机MLP

1. 基础理论 神经网络基础&#xff1a; 目标&#xff1a;了解神经网络的结构&#xff0c;包括神经元、权重、偏置和激活函数。 神经网络是由多个层次的神经元组成的网络&#xff0c;它模拟了人脑处理信息的方式。每个神经元可以接收输入、处理输入并生成输出。这一过程涉及到…

Linux防火墙与SElinux

文章目录 一、防火墙介绍二、iptables和firewalld的区别操作方式&#xff1a;配置层面&#xff1a;性能和管理&#xff1a; 三、iptables与firewalld的优缺点iptablesfirewalld 四、iptables的工作流程五、firewalld的工作流程六、iptables安装与使用6.1、关闭firewalld服务6.2…

c#数据库: 11.分组统计学生信息/ 12.视图查询

该例以学生信息表为例&#xff0c;将学生信息按年级和性别分组&#xff0c;统计各年级男生和女生的人数、总成绩和平均成绩&#xff0c;并将查询结果按平均成绩降序排列。下图是原数据表staq: 【C#实现过程】 &#xff08;1&#xff09;创建一个名为StudentGroup的窗体应用程序…

RK3588S和ARM阵列服务器在虚拟化云平台的应用

RK3588是瑞芯微2021年底推出的首款高端8nm旗舰芯片&#xff0c;而RK3588S 则是针对消费端市场在RK3588基础上缩减了部分外围接口&#xff0c;CPU、GPU和NPU等主要参数得到了保留&#xff0c;主要应用范围为高端ARM平板、ARM笔电产品&#xff0c;会议平板类、ARM服务器、智能机器…

HTML_CSS学习:常用的字符属性

一、字体大小 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>字体大小</title><style>/*body{*//* font-size: 20px;*//*}*/.atguigu1{font-size: 40px;}.atguigu2{font-size: 30px;…

如何批量删除多个不同路径的文件但又保留文件夹呢

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、我准备了三个文件夹&#xff08;实际操作的时候可能是上百个文件夹&#xff0c;无所谓&#xff09;&#xff0c;里面都放了两个图片 2、然后打开工具&am…

【Gateway】网关集成Knife4j—swagger接口文档

文章目录 前言一、相关配置1.网关gateway配置①.网关增加配置 pom文件②.网关增加配置 SwaggerHandler③.网关增加配置 SwaggerResourceConfig④.网关增加配置 SwaggerConfig 2.网关过滤器 二、接口文档使用1.访问文档2.查看文档 总结 前言 在日常开发中是需要前后端联调的&am…

09_Scala函数和对象

文章目录 函数和对象1.函数也是对象 scala中声明了一个函数 等价于声明一个函数对象2.将函数当作对象来用&#xff0c;也就是访问函数&#xff0c;但是不执行函数结果3.对象拥有数据类型(函数类型)&#xff0c;对象可以进行赋值操作4.函数对象类型的省略写法&#xff0c;也就是…

HTML+CSS从入门到精通(三)

&#xff08;9&#xff09;右侧搜索框 <!--这里就是表示HTML5--><!DOCTYPE html><html lang"zh" xmlns:th"http://www.thymeleaf.org"xmlns:v-bind"http://www.w3.org/1999/xhtml"xmlns:v-on"http://www.w3.org/1999/xhtml&…

变电站综合自动化系统:Modbus-PLC-645转IEC104网关方案

前言 电力行业作为关系国计民生的重要基础产业&#xff0c;是关系千家万户的公用事业。但是要做好电力行业安全保障工作的前提&#xff0c;是需要对应的技术人员详细了解电力工业使用的系统、设备以及各类协议的安全特性&#xff0c;本文将主要介绍IEC 104协议的定义和钡铼技术…

mac用Homebrew安装MySQL并配置远程登录

1. 简介 MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;后被 Oracle 公司收购。MySQL 使用 SQL&#xff08;Structured Query Language&#xff09;作为查询语言&#xff0c;并提供了强大的功能和性能…

Vue组合式API进阶:深入了解进阶API

目录 引言 进阶API介绍 1.shallowRef() 2.triggerRef() 3.customRef () 4.toRow() 引言 在Vue 3中&#xff0c;组合式API为开发者提供了更加灵活和直观的方式来组织和管理组件的逻辑。除了基础的ref和reactive之外&#xff0c;Vue还提供了许多高级API函数&#xff0c;帮助我…

C++——STL容器——vector

vector是STL容器的一种&#xff0c;和我们在数据结构中所学的顺序表结构相似&#xff0c;其使用和属性可以仿照顺序表的形式。vector的本质是封装了一个动态大小的数组&#xff0c;支持动态管理容量、数据的顺序存储以及随机访问。 1.前言说明 vector作为容器&#xff0c;应该…

深入理解C++中的仿函数(Functors)

在C中&#xff0c;仿函数或函数对象是通过重载operator()的类实例来模拟函数行为的对象。这种特性使得C的对象可以像函数一样被调用&#xff0c;从而为编程提供了极大的灵活性和强大的功能。 1. 什么是仿函数&#xff1f; 仿函数是一个类&#xff0c;它定义了一个或多个opera…

【设计模式】使用策略模式优化表单校验逻辑

什么是策略&#xff1f; 所谓策略&#xff0c;就是根据已知条件决定要做出怎样的行为。 举个栗子&#xff1a;我要实现一个表单校验功能&#xff0c;要求 name 不能为空且长度必须大于 2 且小于 4&#xff0c;age 不能为空且必须为纯数字。 这样的判断逻辑直接用 if-else 就…

安全再升级,亚信安慧AntDB数据库与亚信安全二次牵手完成兼容性互认证

日前&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧&#xff09;的产品与亚信科技&#xff08;成都&#xff09;有限公司&#xff08;简称&#xff1a;亚信安全&#xff09;再次携手&#xff0c;完成亚信安慧AntDB数据库与亚信安全IPoE接入认证系统…