设计模式-状态模式(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

相关文章

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹