3.8设计模式——State 状态模式(行为型)

embedded/2024/9/29 5:38:15/

意图

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

结构

  • Context(上下文)定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前状态。
  • State(状态)定义一个接口以封装与Context的一个特定状态相关的行为。
  • ConcreteState(具体状态子类)每个子类实现与Context的一个状态相关的行为。
  • Handle是一个代表处理当前状态的动作或方法的命名。在状态模式中,每个具体状态子类都会实现自己的 handle 方法,用来定义该状态下的具体行为或逻辑。当上下文调用 handle 方法时,实际执行的是当前状态对应的具体状态子类中的 handle 方法。

适用性

  • 一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这个对象可以不依赖于其他对象独立变化。

代码示例

java">// 状态接口
interface State {void handle();
}// 具体状态子类A
class ConcreteStateA implements State {@Overridepublic void handle() {System.out.println("Handling state A");}
}// 具体状态子类B
class ConcreteStateB implements State {@Overridepublic void handle() {System.out.println("Handling state B");}
}// 上下文类
class Context {private State currentState;public Context() {// 初始状态为AcurrentState = new ConcreteStateA();}public void setState(State state) {this.currentState = state;}public void request() {currentState.handle();}
}// 测试
public class StatePatternExample {public static void main(String[] args) {Context context = new Context();// 初始状态为Acontext.request();// 改变状态为Bcontext.setState(new ConcreteStateB());context.request();}
}

在这个示例中,State接口定义了状态的行为,ConcreteStateA和ConcreteStateB是具体状态子类,分别实现了不同状态下的行为。Context类维护了一个当前状态的实例,根据当前状态来调用相应的行为。在测试中,创建了一个Context对象并初始化为状态A,然后改变状态为B并调用请求方法,观察输出结果。


http://www.ppmy.cn/embedded/16386.html

相关文章

2024 泛娱乐企业出海音视频选型攻略

前言 在全球化扩张的大潮中,精准选择音视频技术平台对出海企业至关重要。本文将聚焦于评估即构音视频解决方案在关键的五大出海区域的性能表现,并深度解析各地区的市场特征及对应战略。旨在为志在全球市场扩张的企业提供详细的分析和策略指导&#xff0…

数据结构 - 链表详解(二)—— 带头双向循环链表

链表的介绍 链表的结构一共有八种:带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。 今天我们来详解带头双向循环链表 带头双向循环链表是一种数据结…

一文读懂VR数字展览会,从沉浸式体验到市场竞争力的全方位提升

在数字化转型的浪潮中,VR技术正逐渐成为商业展览的新趋势。VR数字展览会通过创新的展示功能和互动体验,为参展商和观众带来前所未有的便利和效果。 一、VR展示功能的沉浸式体验 1、全方位沉浸式体验: VR技术能够创造一个全方位的三维展览环…

Mac安装telnet

一、安装Homebrew 1、打开官网:Homebrew — The Missing Package Manager for macOS (or Linux) 2、打开终端输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 二、安装Telnet bre…

React 15~18每个阶段更新了什么

文章目录 React 15React 16React 17 试验性并发模式React 18 React 15 React.createClass (弃用) class 组件 函数组件(无状态、纯UI组件) 堆栈diff(同步更新state1->state2->state3…、每个更新过程不可中断&a…

JAVA毕业设计136—基于Java+Springboot+Vue的房屋租赁管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的房屋租赁管理系统(源代码数据库)136 一、系统介绍 本项目前后端分离,分为管理员、用户、工作人员、房东四种角色 1、用户/房东: …

Ansible自动化

Ansible自动化 自动化的需求: 1. 在什么样的场景下需要自动化? 批量化的工作: 装软件包、配置服务、升级、下发文件… 2. 为什么在自动化工具中选择ansible? 对比shell脚本: 相对于用shell的脚本来实现自动化&#x…

【Qt QML】TabBar的用法

Qt Quick中的TabBar提供了一个基于选项卡的导航模型。TabBar由TabButton控件填充,并且可以与任何提供currentIndex属性的布局或容器控件一起使用,例如StackLayout或SwipeView。 import QtQuick import QtQuick.Controls import QtQuick.LayoutsWindow …