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

本文主要是介绍设计模式-状态模式(State Pattern)结构|原理|优缺点|场景|示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

状态模式(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()等方法,实际上是由当前状态对象决定具体的行为。随着状态的改变,播放器的行为也会相应变化。

这篇关于设计模式-状态模式(State Pattern)结构|原理|优缺点|场景|示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945553

相关文章

表现层设计模式_1.MVC模式

1.MVC模式三个核心模块                 MVC是一种目前广泛流行的软件设计模式。近年来,随着Java EE的成熟,MVC成为了Java EE平台上推荐的一种设计模式。MVC强制性地把一个应用的输入、处理、输出流程按照视图、控制、模型的方式进行分离,形成了控制器、模型、视图三个核心模块。         (1)控制器(Controller):          接受用户的输

Zabbix3.X---Zabbix _Agent主动模式的监控(Active)

(一)简介 ·        如果zabbix_server端当主机数量过多的时候,虽然可以通过增加代理的方式来进行收集数据,但是需要增加proxy机;还可以通过zabbix_agent主动往由Server端去发生数据来解决,否则,Zabbix会出现严重的性能问题,主要表现如下:  1、当被监控端主机过多时,web操作很卡,容易出现502,以及数据库等方面的问题。 2、容易造成图层断裂。 3、开

图的常用存储结构

觉得这个讲的比书上清楚一点,就转过来,分享一下,也留着自己可以认真的更好的理解下。。 8.2 图的存储结构   图的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表、十字链表和邻接多

软件工程期末复习(8)需求的表达方法和状态转换图

需求的表达方法 系统模型 需求分析的任务就是借助于当前系统的逻辑模型导出目标系统的逻辑模型,解决目标系统 “做什么” 的问题 通常软件开发项目是要实现目标系统的物理模型。目标系统的具体物理模型是由它的逻辑模型经实例化,即具体到某个业务领域而得到的。导出目标系统的逻辑模型的过程中,对系统进行建模有着不可替代的作用。  在需求分析阶段创建模型的作用: 模型帮助分析员理解系统的

C++语法|指向类成员(成员变量和成员方法)的指针及其相关应用场景

文章目录 1.基本语法指向成员变量的指针示例 指向成员函数的指针示例 注意事项 2.应用场景泛型编程和模板:通用成员访问打印函数回调机制和事件处理:基于简单GUI框架的事件处理 1.基本语法 指向类成员的指针是一种特殊的指针类型,用于指向类的成员变量或成员函数。与普通指针不同,指向类成员的指针不能单独使用,必须结合特定的类对象来进行访问。 指向成员变量的指针 指向成员变量的

视觉识别应用的场景有哪些

1.视觉识别应用的场景有哪些 视觉识别应用的场景非常广泛,以下是一些常见的应用场景: 品牌与营销:视觉识别在品牌建设中起着至关重要的作用。它能帮助企业在市场上建立独特的品牌形象,并通过各种印刷品(如名片、信纸、宣传册、海报等)、网站设计、广告与营销以及包装设计等方式,确保品牌视觉的一致性,从而增强品牌的专业形象和认知度。智慧城市:在智慧城市建设中,AI视觉识别技术被广泛应用。通过对城市中的摄像

Java面试八股之WeakHashMap的工作原理

简述WeakHashMap的工作原理 弱键(Weak Keys): WeakHashMap 的键(keys)是通过 WeakReference 弱引用进行封装的。弱引用是一种特殊的引用类型,它不会阻止所引用的对象被垃圾收集器回收。这意味着,如果一个键对象除了作为 WeakHashMap 的键之外没有任何强引用指向它,那么在进行垃圾回收时,这个键对象可以被当作垃圾回收,即使它还在 WeakHas

Linux下C结构体初始化[总结]

链接:http://www.cnblogs.com/Anker/p/3545146.html 1、前言   今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示: typedef struct _data_t {int a;int b;}data_t;data_t data = {.a = 10,.b = 20,}

「AIGC算法」近邻算法原理详解

本文主要介绍近邻算法原理及实践demo。 一、原理 K近邻算法(K-Nearest Neighbors,简称KNN)是一种基于距离的分类算法,其核心思想是距离越近的样本点,其类别越有可能相似。以下是KNN算法的原理详解: 1. 算法原理 KNN算法的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。当输入一个新的没有标签的数据后,将这个数据的每个特征与训练集

Ubuntu中基于QT的系统网线连接状态的实时监视

1.必要准备          需包: #include <QNetworkInterface> 2.实现获取当前的网线连接状态        以下是自己在网络上搜到的一个解决方法,且没有加入iface.flags().testFlag(QNetworkInterface::IsRunning) 这一逻辑判断,经测试实时性极不可靠,在虚拟机里调试时发现有时候有10s左右的延迟,但运行在嵌入式