状态模式S

news/2024/12/1 10:27:01/

状态模式(State Pattern)是行为设计模式的一种,它允许一个对象在其内部状态发生改变时改变其行为。这个对象被视为类型的有限状态机(Finite State Machine)。

状态模式中,我们创建表示各种状态的对象和一个上下文对象(context),该上下文对象持有当前状态的引用,并可以在不同状态之间切换。这些状态对象共享一个公共的接口,以便上下文可以与任何状态对象交互,而无需知道具体是哪个状态。这样,当状态发生改变时,上下文的行为也会相应改变,但上下文本身并不直接修改其状态,而是委托给状态对象来处理状态的转换。

组成

‌状态接口或抽象类‌(State)

定义一个接口或抽象类,以封装与特定状态相关的行为。

‌具体状态类‌(Concrete State)

实现或继承状态接口或抽象类,每个具体状态类实现与状态相关的行为,并可以定义状态转换的逻辑。

‌上下文类‌(Context)

持有一个状态对象的引用,可以委托当前状态对象处理请求,从而使得上下文的行为随状态改变而改变。上下文类通常包含一个或多个与状态相关的方法,这些方法会调用状态对象的方法。

Demo

设计一个交通信号灯系统。交通信号灯有三种状态:红灯(Red)、绿灯(Green)和黄灯(Yellow)。我使用状态模式来实现信号灯状态的切换和状态相关的行为。

定义状态接口 TrafficLightState

package org.example.state;public interface TrafficLightState {void change(TrafficLight trafficLight);
}

状态接口具体的实现类 RedState,RedState,RedState

package org.example.state;public class RedState implements TrafficLightState{@Overridepublic void change(TrafficLight trafficLight) {System.out.println("Red Light -- Stop!");trafficLight.setState(new GreenState());}
}
package org.example.state;public class GreenState implements TrafficLightState{@Overridepublic void change(TrafficLight trafficLight) {System.out.println("Green Light -- Go!");trafficLight.setState(new YellowState());}
}
package org.example.state;public class YellowState implements TrafficLightState{@Overridepublic void change(TrafficLight trafficLight) {System.out.println("Yellow Light -- Gaution!");trafficLight.setState(new RedState());}
}

创建一个 TrafficLight 类作为上下文

package org.example.state;public class TrafficLight {private TrafficLightState state;public TrafficLight() {this.state = new RedState();}public void setState(TrafficLightState state) {this.state = state;}public void change() {state.change(this);}
}

测试

package org.example.state;public class StateMain {public static void main(String[] args) {TrafficLight light = new TrafficLight();for (int i = 0; i <= 10; i++) {light.change();}}
}

<font style="color:rgb(51, 51, 51);">LightState</font>接口定义了一个<font style="color:rgb(51, 51, 51);">pressButton</font>方法,该方法用于处理按下按钮时的行为。<font style="color:rgb(51, 51, 51);">OnState</font><font style="color:rgb(51, 51, 51);">OffState</font>类实现了这个接口,并分别定义了开状态和关状态下按下按钮的行为。<font style="color:rgb(51, 51, 51);">LightSwitch</font>类持有一个<font style="color:rgb(51, 51, 51);">LightState</font>对象的引用,并通过<font style="color:rgb(51, 51, 51);">pressButton</font>方法委托当前状态对象处理按下按钮的请求。在客户端代码中,我们创建了一个<font style="color:rgb(51, 51, 51);">LightSwitch</font>对象,并模拟了按下按钮的动作,可以看到电灯的状态在开和关之间切换

优点

  • ‌封装性良好‌:状态模式将状态相关的行为封装在独立的状态类中,使得状态的变化对上下文类来说是透明的。
  • ‌扩展性强‌:通过添加新的状态类,可以很容易地扩展系统的行为,而无需修改现有的代码。
  • ‌维护性高‌:状态模式使得状态转换和状态相关的行为明确且集中,有助于代码的维护和调试。
  • ‌解耦‌:状态模式将状态的行为与上下文类解耦,使得上下文类可以专注于处理业务逻辑,而无需关心状态的具体实现。

缺点

  • ‌类数量增加‌:每个状态都需要一个单独的类,这会导致系统的类数量增加,从而增加了管理的复杂性。
  • ‌逻辑分散‌:状态转换和状态相关的行为被分散到多个状态类中,这可能会使得理解和跟踪系统行为变得更加困难。
  • 适用场景

适用场景

对象的行为取决于其状态,并且这些状态在运行时会发生变化。需要使用大量的条件语句(如if-else或switch-case)来根据对象的状态选择其行为,这时可以考虑使用状态模式来替代这些条件语句,以提高代码的可读性和可维护性。


http://www.ppmy.cn/news/1551457.html

相关文章

ERROR in [eslint] Invalid Options ‘extensions‘ has been removed.

看着这个报错 感觉是版本不对引起的 ERROR in [eslint] Invalid Options: - Unknown options: extensions - extensions has been removed. ERROR in Error: Child compilation failed: [eslint] Invalid Options: - Unknown options: extensions - extensions has b…

DLL中的inline static成员变量:Windows开发中的常见陷阱

在Windows平台进行C开发时&#xff0c;DLL&#xff08;动态链接库&#xff09;是一个非常重要的概念。它让我们能够实现代码的模块化和动态加载&#xff0c;提高了程序的灵活性和维护性。然而&#xff0c;当我们在DLL中使用C17引入的inline static成员变量时&#xff0c;可能会…

微服务篇-微服务保护:使用 Sentinel 来实现请求限流、线程隔离、服务熔断和 Fallback 备用方案的使用

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 微服务保护 1.1 请求限流方案 1.2 线程隔离方案 1.3 服务熔断方案 2.0 Sentinel 2.1 Sentinel 安装 2.2 微服务整合 3.0 Sentinel-请求限流 4.0 Sentinel-线程隔离…

Python蒙特卡罗MCMC:优化Metropolis-Hastings采样策略Fisher矩阵计算参数推断应用—模拟与真实数据...

全文链接&#xff1a;https://tecdat.cn/?p38397 本文介绍了其在过去几年中的最新开发成果&#xff0c;特别阐述了两种有助于提升 Metropolis - Hastings 采样性能的新要素&#xff1a;跳跃因子的自适应算法以及逆 Fisher 矩阵的计算&#xff0c;该逆 Fisher 矩阵可用作提议密…

微信小程序开发入门 笔记一 2024/11/29

笔记: 微信小程序入门 新建项目 .json 后缀的 JSON 配置文件.wxml 后缀的 WXML 模板文件.wxss 后缀的 WXSS 样式文件.js 后缀的 JS 脚本逻辑文件 小程序中&#xff0c;JSON扮演的静态配置的角色。 app.json 小程序的全局配置包含 页面路径 页面表现 网络超时时…

Python 简单的网页服务器

1. 介绍 这个脚本可以创建一个简单的网页服务器&#xff0c;让你可以通过浏览器访问本地电脑上的文件。这在开发和测试网页时非常有用。 2. 代码 import http.server import socketserverPORT 8000 # 端口号Handler http.server.SimpleHTTPRequestHandlerwith socketserve…

编译以前项目更改在x64下面时报错:函数“PVOID GetCurrentFiber(void)”已有主体

win32下面编译成功&#xff0c;但是x64报错 1>GetWord.c 1>md5.c 这两个文件无法编译 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24125,1): error C2084: 函数“PVOID GetCurrentFiber(void)”已有主体 1>C:\Program Files (x…

我们项目要升级到flutter架构的几点原因

一、探索 Flutter打造卓越移动应用的新时代框架 在移动应用开发的世界里&#xff0c;Flutter已经成为了一个炙手可热的话题。诞生于Google的怀抱&#xff0c;Flutter以其独特的优势和理念&#xff0c;正在引领一场全球范围内的应用开发 ** 。本文将深入探讨Flutter项目的特点、…