软件设计模式与体系结构-设计模式-行为型软件设计模式-状态模式

news/2024/10/18 1:33:30/

五、状态模式

概念

与策略模式类似,状态模式将不同状态下的行为封装在不同的类中,每个类代表一个状态

状态模式的组成

  1. Context:定义了与客户程序的接口,它保持了一个concreteState的代表现在状态的实例
  2. State:定义了状态接口,它的各个子类封装了在各种不同状态下的行为
  3. ConcreteState子类:封装了在各种不同状态下的行为

类图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态发生变化时改变其行为,使得对象在不同状态下具有不同的行为。状态模式通过将状态封装成独立的类,并将状态之间的转换逻辑抽象出来,使得状态的变化对于使用者来说是透明的。

下面是一个简单的状态模式的代码示例,以说明其工作原理:

// 状态接口
interface State {void handleState();
}// 具体状态类:状态A
class ConcreteStateA implements State {public void handleState() {System.out.println("执行状态A的行为");}
}// 具体状态类:状态B
class ConcreteStateB implements State {public void handleState() {System.out.println("执行状态B的行为");}
}// 上下文类
class Context {private State currentState;public void setState(State state) {currentState = state;}public void performAction() {currentState.handleState();}
}// 示例
public class Main {public static void main(String[] args) {// 创建状态对象State stateA = new ConcreteStateA();State stateB = new ConcreteStateB();// 创建上下文对象Context context = new Context();// 设置初始状态为状态Acontext.setState(stateA);// 执行行为context.performAction();  // 输出:执行状态A的行为// 切换到状态Bcontext.setState(stateB);// 执行行为context.performAction();  // 输出:执行状态B的行为}
}

在上面的示例中,状态模式涉及三个主要角色:

  • 状态接口(State):定义了一个共同的接口,该接口表示一个状态,并声明了该状态下的行为。
  • 具体状态类(ConcreteState):实现了状态接口,表示具体的状态,每个具体状态类实现自己的行为逻辑。
  • 上下文类(Context):持有一个当前状态的引用,并调用当前状态的方法来执行相应的行为。

通过将状态封装成独立的类,并在上下文类中使用状态对象来执行行为,状态模式实现了状态和行为之间的解耦,使得状态的变化对于上下文类和使用者来说是透明的。在示例中,上下文类的行为会根据当前状态的不同而发生变化。

状态模式的优点包括:

  • 将状态转换逻辑封装在状态类中,使得新增或修改状态变得简单,符合开闭原则。
  • 避免了大量的条件语句,使代码结构清晰,易于理解和维护。
  • 将状态的变化与具体的行为分离,使得状态变化不会影响到其他部分的代码。

总之,状态模式可以提供一种简洁的方式来处理对象的状态变化,并将状态的行为与上下文类解耦,使得代码更加可扩展和易于维护。它在需要根据对象状态改变行为的场景中具有很好的应用价值。

策略模式与状态模式

策略模式(Strategy Pattern)和状态模式(State Pattern)是两种不同的行为型设计模式,它们都用于解决对象行为的变化和动态切换的问题,但在实现方式和应用场景上存在一些差异。

  • 策略模式关注的是不同算法或策略的替换和选择,它将每个策略封装在独立的类中,并使得这些策略对象可以相互替换,从而使得客户端可以在运行时选择不同的策略对象。策略模式通过封装不同的算法,使得算法可以独立于使用它们的客户端而变化。在策略模式中,客户端决定使用哪个策略,然后将控制权交给相应的策略对象。

  • 状态模式关注的是对象的状态变化,并在不同状态下提供不同的行为。它通过将对象的状态封装在独立的状态类中,并使得状态对象可以相互切换,从而实现不同状态下的不同行为。状态模式的关键在于将状态的切换和行为的实现分离开来,从而使得客户端可以根据对象的状态来选择相应的行为。在状态模式中,状态的切换是由上下文对象来控制的,上下文对象根据当前的状态选择相应的行为。

  • 虽然策略模式和状态模式都涉及到对象行为的变化和动态切换,但它们的重点和应用场景有所不同。策略模式主要用于选择和替换算法或策略,适用于需要在运行时根据不同情况选择不同算法的场景。而状态模式主要用于管理对象的状态变化和相应的行为切换,适用于对象具有多个状态,且每个状态下的行为有所不同的场景。

需要注意的是,策略模式和状态模式都可以提高代码的灵活性和可维护性,通过将变化的部分封装起来,使得变化不会影响到其他部分的代码。根据具体的需求和设计目标,选择合适的设计模式来解决问题是很重要的。

交通信号控制灯的实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

课程作业

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


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

相关文章

021-企业站:纽曼移动端微官网实战

一、移动端纽曼项目首页菜单栏模块 二、移动端纽曼项目首页产品中心模块 三、移动端纽曼项目首页新闻列表模块 四、移动端纽曼项目首页公司简介模块

投影仪怎么看电视节目?超简单几个步骤小白也能马上学会

小时候我们大院看电视节目都是通过胶卷投影实现的,简单原理就是把图像或者视频投射到大白布上,让更多的人一起来欣赏,这是最开始的投影概念。由于现在科学技术的进步,不同于以前的投影设备,更加智能化的投影仪应运而生…

[自学第十一天] 静态项目实战_纽曼官网(用时三天)

1.需求分析 2.创建项目目录 样式分为 index.css 首页内容样式 public.css 公共样式 reset.css 页面样式初始化 3.完成首页的结构与样式 首页结构展示 初始化样式部分展示 4.最终效果展示(静态) 5.总结 第一次自己写静态网页,思路不是很清晰,结构调整了很久.样式也敲了很久才…

第4章 集成

声明,此连续文章为阅读《微服务设计》[英]纽曼(Sam Newman)的读书笔记,旨在记录重点内容和阅读心得,有共读的朋友可以交流书中疑惑。 4.1 寻找理想的集成技术的指导原则 避免服务方修改一个字段就引起消费方的修改 保…

纽曼皮尔逊准则Matlab实现,matlab 已知门限怎么求虚警概率蒙特卡罗仿真

满意答案 wangxun413 2016.08.05 采纳率:40% 等级:8 已帮助:763人 检测性能的蒙特卡罗仿真 一、实验目的 进一步熟悉蒙特卡洛仿真方法及其在检测性能分析中的应用。 二、实验内容 仿真高斯白噪声中恒定电平检测的性能。 设有两种假设&…

纽曼皮尔逊准则Matlab实现,噪声恒虚警处理电路的计算机仿真

0 引 言 雷达系统的信号检测是在各种噪声和杂波干扰的环境中进行的。视频的回波信号与噪声、杂波一起送到检测器,并在检测器对视频信号进行分级,即设置一个检测门限。如果信号超过该门限,就判决目标存在。显然,门限电平的选择是至关重要的。如图1所示。如果门限设置太高,本…

带有时滞反应扩散方程代码(纽曼条件的)

function drying % 初始化参数 clear; d12;d22; r1;k500000;mmu10.1;alpha1;mmu20.3;A0.2; tau0.4; l30;%区间长度为l*pi N20;%N是tau/h(h为时间上划分的步长) htau/N; K6000;%时间方向计算步数 Th*K;%时间最值为T pKN1;%时间点总数 M100;%Delta{x}为空间上的划分,Mpi/Delta{x…

纽曼皮尔逊准则Matlab实现,纽曼-皮尔逊准则,Neyman Pearson Criterion,在线英语词典,英文翻译,专业英语...

胡安曼纽尔方吉奥(阿根廷) 世界冠军 - 1951, 1954-1957 参加大奖赛次数: 51 赢得分站赛冠军次数: 22 赢得杆位数: 27 很多人都把方吉奥看作是最伟大的车手。在整整七个赛季的f1比赛中(他为了从一场几乎致命的事故中康复而错过了一个赛季),他获得了五次世界总冠军的头…