设计模式-状态模式和策略模式

1.状态模式

1.1定义

当一个对象的内在状态改变时允许根据当前状态作出不同的行为;

1.2 适用场景

(1)一个对象的行为取决于它的状态,并且它必须在运行时根据状态来决定其行为.

(2)代码中包含了大量的与状态有关的条件语句,例如:一个操作含有庞大的多分值语句(if-else或者switch-case), 且这些分支依赖于该对象的状态.

简言之就是需要用到状态机的地方都可以.

1.3 场景举例

游乐场的抓娃娃机, 提供了摇杆,但是在投币了和未投币的情况下,给出的响应是不一样的,尽管动作是相同的.

1.4状态模式的UML类图

  • Context, 调用主体,拥有和维护一个State实例;
  • State, 定义了状态接口,一系列行为的状态;
  • ConcreteStateA, 具体状态类,实现了State状态接口,从而达到不同状态下相同动作作出的不同行为.

2.策略模式

2.1定义

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.

2.2适用场景

  • 针对同一类问题的多种处理方式,仅仅是具体行为的有差别时;
  • 需要安全低封装多种同一类型的操作时;
  • 出现同一抽象类有多个子类,而有需要使用if-else或者switch-case来选择具体的子类时.

2.3场景举例

HAL的多家供应商方案, 约定的HAL接口行为是统一规范的,后边对应的具体实现行为是有差异的.

2.4策略模式的UML类图

说明:

  • Context, 调用行为主体,可类比Android 系统服务;
  • Stragety, 策略的抽象, 类比为HAL接口;
  • ConcretaStragetyA, 策略实例,有策略的方法的具体实现,可类比供应商的vendor实现方案.

3.相似异同点

二者在UML图中看起来有点相似,

状态模式下, Context调用主体记录的State是可以根据当前行为在ConcretaStateA和ConcreteStateB之间来回切换;

--- > 封装基于状态的行为,并将行为委托给当前状态类.

而在策略模式下,Context调用主题使用的是一种算法方案封装, 在运行期间只可持有特定的一种, 不可互相来回切换.

--- > 其重点在于可以互换的行为封装.

二者都属于行为型的设计模式.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest测试框架pytest-random-order插件随机执行用例顺序

Pytest提供了丰富的插件来扩展其功能,本章介绍下pytest-random-order插件,随机设置pytest测试用例的运行顺序,并对随机性进行一些控制。 官方文档: https://pytest-cov.readthedocs.io/en/latest/index.html 适配版本说明&#x…

xlsx实现excel下载功能——js

import dayjs from "dayjs"; import * as XLSX from "xlsx"; import XLSXS from "xlsx-style";export function export2Excel(info: {// 文件名&#xff08;工作簿名&#xff09;title: string;// 数据data: any[] | Record<string, any>[…

Crontab命令详解:轻松驾驭Linux定时任务,提升系统效率

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 引言&#xff1a; crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件…

AI agent是什么,什么技术栈

AI agent&#xff0c;也称为会话代理或聊天机器人&#xff0c; 是一种通过文本或语音模拟人类对话的计算机程序。 它们旨在以自然且引人入胜的方式理解和响应用户输入。 AI agent 被广泛用于各种应用中&#xff0c;包括客户服务、营销、 销售和教育。 有两种主要类型的 AI agen…

软件包管理简介

windows的软件包都不能直接在windows当中安装和使用&#xff0c;好处是windows中的大部分病毒和木马对于Linux都是不可识别的。坏处是所有的软件都必须对linux单独进行软件开发。 1.软件包分类 源码包 脚本安装包 绝大多数源代码包都是使用C语言来写的。 特征是开源。 二进…

Qt开发报错:Q_INTERFACES Error: Undefined interface

1、背景 VS2019qt5.12.10 从svn拉下来的项目&#xff0c;结果报错&#xff1a; Q_INTERFACES Error: Undefined interface 之前在VS的扩展中在线安装了qt插件&#xff0c; 安装了一半&#xff0c;比较慢&#xff0c;直接强行退出了。。 后来安装了qt官网的插件。。。。 2、报…

Linux内核 -- 汇编结合ko案例之PMU获取cpu cycle技术

ARMv7汇编实现周期计数读取与清空 本文档详细描述了如何在ARMv7平台上使用汇编语言编写周期计数器读取与清空函数&#xff0c;如何在内核模块中导出这些函数供其他模块调用&#xff0c;以及如何使用Netlink接口供用户态程序进行调用。 1. 汇编函数实现 首先&#xff0c;编写…

nginx架构学习

前言 这篇文章主要记录下对nginx架构的学习记录。 架构设计 优秀的模块化设计 高度模块化的设计是Nginx的架构基础。在Nginx中&#xff0c;除了少量的核心代码&#xff0c;其他一切皆 为模块。 在这5种模块中&#xff0c;配置模块与核心模块都是与Nginx框架密切相关的&…

Pharmacy Management System v1.0 文件上传漏洞(CVE-2022-30887)

前言 CVE-2022-30887 是一个存在于 Pharmacy Management System v1.0 中的远程代码执行&#xff08;RCE&#xff09;漏洞。这个漏洞存在于 /php_action/editProductImage.php 组件中。攻击者可以通过上传一个精心制作的图像文件来执行任意代码。 漏洞详细信息 漏洞描述: Pha…

第二十三课,再识字符串

前言&#xff0c;再识字符串 字符串是我们学习python编程第一眼见到的东西&#xff0c;一行print(“hello world”)可谓是太亲切了&#xff0c;但在此之前我们对字符串的认知也仅局限于如何用单引号、双引号、三引号去定义字符串并打印&#xff0c;今天开始我们就更深入地去理…

推荐系统入门

https://github.com/LongxingTan/Machine-learning-interview/blob/main/03_system/03_ml/recommendation.md 离线层&#xff1a;不用实时数据&#xff0c;不提供实时响应&#xff1b; 近线层&#xff1a;使用实时数据&#xff0c;不保证实时响应&#xff1b; 在线层&#xff…

【大数据】StarRocks的系统架构

StarRocks 架构简洁&#xff0c;整个系统的核心只有 FE&#xff08;Frontend&#xff09;、BE (Backend) 或 CN (Compute Node) 两类进程&#xff0c;方便部署与维护&#xff0c;节点可以在线水平扩展&#xff0c;元数据和业务数据都有副本机制&#xff0c;确保整个系统无单点。…

淘宝评论数据爬取全攻略:一网打尽好评差评,轻松分析消费趋势

在大数据时代&#xff0c;淘宝评论数据如同一座金矿&#xff0c;蕴藏着消费者的直接反馈和市场趋势。作为Python爬虫工程师&#xff0c;如何高效、合法地挖掘这座金矿&#xff1f;本文将手把手教你打造一款强大的淘宝评论爬虫&#xff0c;让你在数据分析的海洋里乘风破浪。关键…

Sharding 分片配置实例

Sharding 分片配置实例 shardingRule:tables:t_order:actualDataNodes: ds${0..1}.t_order${0..1}databaseStrategy:inline:shardingColumn: user_idalgorithmExpression: ds${user_id % 2}tableStrategy: inline:shardingColumn: order_idalgorithmExpression: t_order${orde…

轻松解锁电脑强悍性能,4000MHz的玖合星舞 DDR4 内存很能打

轻松解锁电脑强悍性能&#xff0c;4000MHz的玖合星舞 DDR4 内存很能打 哈喽小伙伴们好&#xff0c;我是Stark-C~ 很多有经验的电脑玩家在自己DIY电脑选购内存条的时候&#xff0c;除了内存总容量&#xff0c;最看重的参数那就是频率了。内存频率和我们常说的CPU主频一样&…

通用管理页面的功能实现

在Windows Forms&#xff08;WinForms&#xff09;应用程序中&#xff0c;创建一个通用的管理页面通常涉及对数据的增删改查&#xff08;CRUD&#xff09;操作&#xff0c;以及一些额外的功能&#xff0c;如数据过滤、排序、导出和导入等。 先看一个仓库管理页面要素。 仓库管…

uniapp开发H5、手机APP、微信小程序 可拖动菜单按钮

ml-fab 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id18909 1、可拖拽悬浮按钮 ml-fab&#xff0c;支持自定义插槽&#xff0c;点击可展开一个图标按钮菜单&#xff0c;可随意拖拽。 2、支持自定义插槽&#xff0c;可实现自定义配置。 3、操作简单易上手。 ml-f…

同元软控受邀出席2024年工业软件与新质生产力创新发展论坛

近日&#xff0c;由广东省工业软件学会主办的“2024年工业软件与新质生产力创新发展论坛”在广州成功举办。同元软控深圳子公司副总经理周胜受邀出席&#xff0c;并作《数智驱动创新&#xff0c;科学计算与系统建模仿真加速新质生产力进化》主题演讲。 本次论坛集结工业软件界…

【IVI】CarService启动-Android13

【IVI】CarService启动-Android13 1、CarServiceImpl启动概述2、简要时序图 1、CarServiceImpl启动概述 【IVI】CarService启动&#xff1a; CarServiceHelperService中绑定CarServiceICarImpl初始化各种服务 packages/services/Car/README.md 2、简要时序图

产品需求说明书模板

在软件开发过程中&#xff0c;需求说明书(Product Requirement Document&#xff0c;PRD)是项目启动的关键文档之一&#xff0c;它明确了项目的目标、范围、功能要求以及非功能要求等。它确保了开发团队、利益相关者和最终用户之间对软件功能和性能有共同的理解。 一、引言 需…