当前位置: 首页 > news >正文

行为模式8.状态模式------灯泡状态切换

行为型模式

  1. 模板方法模式(Template Method Pattern)
  2. 命令模式(Command Pattern)
  3. 迭代器模式(Iterator Pattern)
  4. 观察者模式(Observer Pattern)
  5. 中介者模式(Mediator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 解释器模式(Interpreter Pattern)
  8. 状态模式(State Pattern)
  9. 策略模式(Strategy Pattern)
  10. 职责链模式(Chain of Responsibility Pattern)
  11. 访问者模式(Visitor Pattern)

当涉及状态模式时,它主要用于在对象的状态改变时改变其行为。状态模式允许对象在内部状态改变时改变它的行为,看起来好像是改变了它的类。

以下是状态模式的基本结构和示例:

结构

  1. Context(上下文):定义客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象。
  2. State(状态):定义一个接口以封装与Context的一个特定状态相关的行为。
  3. ConcreteState(具体状态):每一个具体状态类实现了与Context的一个状态相关的行为。

示例

让我们以一个简单的灯光控制器为例来说明状态模式。

// State 接口  
interface State {  void doAction(Context context);  
}  // ConcreteState 实现  
class OnState implements State {  public void doAction(Context context) {  System.out.println("Light is turned on");  context.setState(this);  }  
}  class OffState implements State {  public void doAction(Context context) {  System.out.println("Light is turned off");  context.setState(this);  }  
}  // Context 类  
class Context {  private State state;  public Context() {  state = null;  }  public void setState(State state) {  this.state = state;  }  public State getState() {  return state;  }  
}  // 使用示例  
public class StatePatternExample {  public static void main(String[] args) {  Context context = new Context();  State onState = new OnState();  onState.doAction(context);  State offState = new OffState();  offState.doAction(context);  }  
}  

在这个示例中,`Context` 表示灯光控制器,`State` 是一个接口,定义了状态改变时的行为。`OnState` 和 `OffState` 分别表示开和关的状态,它们实现了 `State` 接口来定义状态改变时的行为。在 `StatePatternExample` 中,我们创建了一个 `Context` 实例,并演示了状态从开到关的转变。

这就是状态模式的基本结构和一个简单示例。状态模式有助于在对象的状态变化时封装对象的行为,并使得状态转换更加清晰和易于维护。

状态模式和策略模式在某种程度上有一些相似之处,因为它们都涉及到在运行时改变对象的行为。

相似之处

  1. 封装算法/行为:两者都涉及将算法或行为封装到独立的类中,以便在运行时进行切换。
  2. 解耦:状态模式和策略模式都有助于将特定的行为与上下文对象解耦,使得它们可以独立地变化和复用。

不同之处

  1. 关注点:状态模式关注对象在不同状态下的行为变化,而策略模式关注在不同策略(算法)下的行为变化。
  2. 触发方式:状态模式的行为转换通常是由对象内部的状态改变触发的,而策略模式的行为转换通常是由客户端显式调用触发的。

总结

虽然这两种模式有相似之处,但它们的关注点和使用场景不同。状态模式适用于对象状态改变时的行为变化,而策略模式适用于根据不同的需求选择不同的算法或策略。理解它们之间的区别有助于选择适当的模式来解决特定的设计问题。

相关文章:

行为模式8.状态模式------灯泡状态切换

行为型模式 模板方法模式(Template Method Pattern)命令模式(Command Pattern)迭代器模式(Iterator Pattern)观察者模式(Observer Pattern)中介者模式(Mediator Pattern…...

Linux账户和组管理——账户和工作组分类,用户账号文件,/etc/passwd文件中7个字段,id 命令

## 账户和工作组的分类 ### 用户分为三类: - 超级账户——账户名为root,它具有一切权限,只有进行系统维护(例如:建立用户等)或其他必要情形下才用超级用户登录,以避免系统出现安全问题。 - 系统账户——是Linux系统正常…...

《大明混一图》: 令人叹为观止的古代世界地图

关注我们 - 数字罗塞塔计划 - 《大明混一图》是我国目前保存尺寸最大、最完整、年代最久远,且由中国人自己绘制的世界地图,2003年10月被列入《中国档案文献遗产名录》,现保存于中国第一历史档案馆。据学者们研究,这幅地图大约是…...

Java高级重点知识点-22-缓冲流、转换流、序列化流、打印流

文章目录 缓冲流字节缓冲流字符缓冲流 转换流InputStreamReader类OutputStreamWriter类 序列化ObjectOutputStream类ObjectInputStream类 打印流 缓冲流 缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流 基本原理: 缓冲流的…...

express民族民俗文化分享平台-计算机毕业设计源码22552

基于Vue的民族民俗文化分享平台设计与实现 摘 要 本文介绍了一种基于Vue.js前端框架和Express后端框架的民族民俗文化分享平台的设计和实现。该平台旨在通过线上方式,促进民族民俗文化的传播与分享,增强公众对多元文化的了解和认同。 平台为普通用户提供…...

Web 基础与HTTP 协议

域名的概述 (1 )域名的结构 (2 )域名结构类型 根域:指的是根服务器,要用来管理互联网的主目录,全世界只有13台。1个为 主根服务器,放置在美国。其余12 个均为辅根服务器,其中9个放置在美国;欧 洲2个&…...

C++超市外卖小程序-计算机毕业设计源码62482

摘要 随着社会生活节奏加快和消费习惯的变化,外卖服务成为人们日常生活中不可或缺的一部分。超市外卖作为新兴业态备受关注,然而传统外卖平台在推荐精准度和用户体验方面存在挑战。 本研究旨在基于协同过滤算法,结合C语言和MySQL数据库&#…...

合合信息“大模型加速器”亮相2024世界人工智能大会

文章目录 📑引言一、大模型发展的挑战数据稀缺问题 二、大模型“加速器”解决方案概述文档解析引擎的特征 三、文档解析引擎的优势3.1 高速处理能力3.2 智能理解文档结构3.3 多种数据类型支持3.4 高精度数据提取3.5 应用广泛,适应性强 四、复杂图表解析4…...

2024.07.03校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、提前批 | 中国兵器工业集团第二〇二研究所 | 提前批/招/聘暨/暑期/开放日 提前批 | 中国兵器工业集团第二〇二研究所 | 提前批招聘暨暑期开放日 2、夏令营 | 2024年南网数字集团“未来…...

MySQL中的DDL语句

第一题 输入密码登录mysql,创建数据库zoo,转换到zoo数据库, mysql> create database zoo character set gbk; mysql> use zoo查看创建数据库zoo信息 mysql> show create database zoo;删除数据库zoo mysql> drop database zo…...

ENSP-防火墙小实验

实验总要求 我的拓扑图: 具体配置 1.交换机 vlan: # sysname Lswl # vlan batch 2 to 3 # 接口: [LSWl]int e 0/0/2 [LSWl-Ethernet0/0/2ldisplay this # interface Ethernet0/0/2port link-type accessport default vlan 2 # return [LsWl-Ethernet0…...

PHP微信小程序视频图文流量主变现小程序系统源码

💰微信小程序新机遇!视频图文流量主变现秘籍🔑 🚀【流量变现新风口】🚀 还在为微信小程序的庞大流量如何转化为真金白银而苦恼吗?今天,就带你揭秘“微信小程序视频图文流量主变现小程序”的神…...

PHP智慧社区小区物业管理系统小程序源码

让生活更便捷,社区更和谐✨ 🏡【开篇:智慧生活,从社区开始】🏡 在快节奏的现代生活中,寻找一份便捷与舒适成为了我们共同的追求。小区,作为我们日常生活的温馨港湾,其管理水平和服…...

手撸俄罗斯方块(五)——游戏主题

手撸俄罗斯方块(五)——游戏主题 当确定游戏载体(如控制台)后,界面将呈现出来。但是游戏的背景色、方块的颜色、方框颜色都应该支持扩展。 当前游戏也是如此,引入了 Theme 的概念,支持主题的扩…...

【测试开发】--安全渗透测试

1. 安全渗透 1.1 分类 web数据库安全web应用服务器安全(文件上传漏洞、文件包含漏洞)web客户端安全(XSS跨站攻击) 2. sql注入 2.1 sql注入介绍 sql注入在安全问题中排行榜首sql注入攻击是输入参数未经过滤,然后直…...

AMEYA360:类比半导体三款车规级新品介绍

类比半导体三款全新车规级智能驱动芯片——HD70504与HD70804四通道高边驱动、HD7004低导通电阻高边驱动以及DR8112直驱马达驱动芯片介绍,进一步扩展了其汽车智能驱动产品的深度与广度。 新品首发,诠释“芯”动未来 HD70504 & HD70804四通道高边驱动芯…...

内衣洗衣机哪个牌子好用?五大硬核宝藏内衣洗衣机推荐

在日常生活中,内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机,不仅可以减少洗衣负担,还能提供高效的洗涤效果。然而,市场上众多内衣洗衣机品牌琳琅满目,让我们往往难以选择。那么&a…...

红酒与未来科技:传统与创新的碰撞

在岁月的长河中,红酒以其深邃的色泽、丰富的口感和不同的文化魅力,成为人类文明中的一颗璀璨明珠。而未来科技,则以其迅猛的发展速度和无限的可能性,领着人类走向一个崭新的时代。当红酒与未来科技相遇,一场传统与创新…...

php快速入门

前言 php是一门脚本语言,可以访问服务器,对数据库增删查改(后台/后端语言) 后台语言:php,java,c,c,python等等 注意:php是操作服务器,不能直接在…...

【排序 - 归并排序】

归并排序(Merge Sort)是一种高效的排序算法,基于分治(Divide and Conquer)策略。它将待排序数组分成两个较小的子数组,分别对它们进行排序,然后将排好序的子数组合并成一个整体有序的数组。归并…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

二维FDTD算法仿真

二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

Yii2项目自动向GitLab上报Bug

Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...