行为模式8.状态模式------灯泡状态切换
行为型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 解释器模式(Interpreter Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
当涉及状态模式时,它主要用于在对象的状态改变时改变其行为。状态模式允许对象在内部状态改变时改变它的行为,看起来好像是改变了它的类。
以下是状态模式的基本结构和示例:
结构
- Context(上下文):定义客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象。
- State(状态):定义一个接口以封装与Context的一个特定状态相关的行为。
- 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
` 实例,并演示了状态从开到关的转变。
这就是状态模式的基本结构和一个简单示例。状态模式有助于在对象的状态变化时封装对象的行为,并使得状态转换更加清晰和易于维护。
状态模式和策略模式在某种程度上有一些相似之处,因为它们都涉及到在运行时改变对象的行为。
相似之处
- 封装算法/行为:两者都涉及将算法或行为封装到独立的类中,以便在运行时进行切换。
- 解耦:状态模式和策略模式都有助于将特定的行为与上下文对象解耦,使得它们可以独立地变化和复用。
不同之处
- 关注点:状态模式关注对象在不同状态下的行为变化,而策略模式关注在不同策略(算法)下的行为变化。
- 触发方式:状态模式的行为转换通常是由对象内部的状态改变触发的,而策略模式的行为转换通常是由客户端显式调用触发的。
总结
虽然这两种模式有相似之处,但它们的关注点和使用场景不同。状态模式适用于对象状态改变时的行为变化,而策略模式适用于根据不同的需求选择不同的算法或策略。理解它们之间的区别有助于选择适当的模式来解决特定的设计问题。
相关文章:
行为模式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)策略。它将待排序数组分成两个较小的子数组,分别对它们进行排序,然后将排好序的子数组合并成一个整体有序的数组。归并…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
el-amap-bezier-curve运用及线弧度设置
文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...