命令模式,观察者模式,状态模式,享元模式

news2025/5/31 20:16:33

什么是命令模式?

核心思想是将原本直接调用的方法封装为对象(如AttackCommand,对象包含​​执行逻辑​​和​​上下文信息​​(如目标、参数)。比如,玩家的按键操作被封装成一个命令对象,而不是直接调用角色的方法,可以支持撤销/重做。

这样可以将请求的发起者和执行者解耦

如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合,这是命令模式的使用场景

使用时机当需要先将一个函数登记上,然后再以后调用此函数时,就需要使用命令模式,其实这就是回调函数。

有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系

例子:拿订餐来说,客人需要向厨师发送请求,但是完全不知道这些厨师的名字和联系方式,也不知道厨师炒菜的方式和步骤。 命令模式把客人订餐的请求封装成 command 对象,也就是订餐中的订单对象这个对象可以在程序中被四处传递,就像订单可以从服务员手中传到厨师的手中。这样一来,客人不需要知道厨师的名字,从而解开了请求调用者和请求接收者之间的耦合关系

什么是观察者模式?

观察者模式是关于多个对象想知道一个对象中数据变化情况。是一种一对多的依赖关系,当一个对象的状态发生变化时,所有它的“观察者”都得到通知。

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

事件
一个类对象可以通过事件来通知别个类对象,如果这个事件发生了,那么关心、订阅这个事件的对象们会纷纷作出反应

事件必须用委托类型来声明,并且只能由该委托类型来订阅

委托
用于将方法作为参数传递给其他方法,是引用类型

使用delegate关键字来声明一个类型,然后再创建这个委托类型实例

委托的优势:多播和动态绑定

Action委托:指向一个无返回值的方法

Func委托:指向一个有返回值的方法

使用场景

(1)当一个对象的数据更新时需要通知其他对象,但这个对象又不希望和被通知的那些对象形成紧耦合。

(2)当一个对象的数据更新时,这个对象需要让其他对象也各自更新自己的数据,但这个对象不知道具体有多少对象需要更新数据

观察者模式满足“开-闭原则”

对扩展开放​

  • ​新增观察者无需修改主题代码

  • ​主题可以动态增减观察者

对修改关闭​

  • ​主题的逻辑不因观察者变化而修改

什么是状态模式?

主要解决:当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

意图:允许一个对象在其内部状态改变时改变它的行为

使用状态模式,可以很好地避免过多的if–else –分支,状态模式将每一个状态分支放入一个独立的类中,每一个状态对象都可以独立存在,程序根据不同的状态使用不同的状态对象来实现功能

要使用状态模式,我们必须明确两个东西:状态和每个状态下执行的动作

在状态模式中,因为所有的状态都要执行相应的动作,所以我们可以考虑将状态抽象出来。

状态的抽象一般有两种形式:接口和抽象类如果所有的状态都有共同的数据域,可以使用抽象类,但如果只是单纯的执行动作,就可以使用接口。

状态模式和策略模式的不同?

用状态模式的情况​

✅ ​​对象行为由内部状态决定​​(如角色状态、AI行为)。
✅ ​​状态之间有逻辑关联​​(如“待机→行走→攻击→待机”)。
✅ ​​状态转换由对象内部管理​​(如角色自动进入下一个状态)。

​用策略模式的情况​

✅ ​​需要动态切换算法​​(如不同武器效果、排序算法)。
✅ ​​策略之间无逻辑关联​​(如火焰、冰冻、雷电是独立的)。
✅ ​​客户端决定使用哪种策略​​(如玩家选择武器)。

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

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

相关文章

kibana解析Excel文件,生成mapping es导入Excel

一、Excel转为CSV格式 在线免费网站:EXCEL转CSV - 免费在线将EXCEL文件转换成CSV (cdkm.com) 二、登录kibana 点击左边菜单栏找到Machine Learning, 进入后上面菜单选择Data Visualizer,然后上穿转好的csv格式的Excel 点击导入输入建立的m…

开疆智能Profinet转Profibus网关连接EC-CM-P1 PROFIBUS DP从站通讯模块配置案例

本案例是通过开疆智能Profibus转Profinet网关将正弦研发的Profibus从站模块连接的EM600变频器接入到西门子1200PLC的配置案例。 配置过程 1. 打开网关配置软件“”新建项目并添加模块PN2DPM并设置参数 2. 设置网关的Profibus参数。如站地址,波特率等。(…

Oracle RMAN自动恢复测试脚本

说明 此恢复测试脚本,基于rman备份脚本文章使用的fullbak.sh做的备份。 数据库将被恢复到RESTORE_LO参数设置的位置。 在恢复完成后,执行一个测试sql,确认数据库恢复完成,数据库备份是好的。恢复测试数据库的参数,比如SGA大小都…

零基础设计模式——结构型模式 - 代理模式

第三部分:结构型模式 - 代理模式 (Proxy Pattern) 在学习了享元模式如何通过共享对象来优化资源使用后,我们来探讨结构型模式的最后一个模式——代理模式。代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。 核心思想:为其…

架构意识与性能智慧的双重修炼

架构意识与性能智慧的双重修炼 ——现代软件架构师的核心能力建设指南 作者:蓝葛亮 🎯引言 在当今快速发展的技术环境中,软件架构师面临着前所未有的挑战。随着业务复杂度的不断增长和用户对性能要求的日益严苛,如何在架构设计中平衡功能实现与性能优化,已成为每个技术…

Dynamics 365 Business Central AI Sales Order Agent Copilot

#AI Copilot# #D365 BC 26 Wave# 最近很多客户都陆续升级到 Dynamics 365 Business Central 26 wave, Microsoft 提供一个基于Copilot 的Sales Order Agent,此文将此功能做个介绍. Explorer: 可以看到26版本上面增加了这样一个新图标。 Configuration: 配置过程…

RabbitMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 选型指南(一)

一、引言 ** 在当今分布式系统大行其道的技术时代,消息队列作为分布式系统的关键组件,起着举足轻重的作用。它就像是一个可靠的信使,在不同的系统模块、服务之间传递信息,让各个部分能够高效、稳定地协同工作。消息队列能够实现系…

汽车EPS系统的核心:驱动芯片的精准控制原理

随着科技的飞速发展,电机及其驱动技术在现代工业、汽车电子、家用电器等领域扮演着越来越重要的角色。有刷马达因其结构简单、成本低廉、维护方便等优点,在市场上占据了一定的份额。然而,为了充分发挥有刷马达的性能,一款高效能、…

【Linux网络编程】传输层协议TCP,UDP

目录 一,UDP协议 1,UDP协议的格式 2,UDP的特点 3,面向数据报 4,UDP的缓冲区 5,UDP使用注意事项 6,基于UDP的应用层协议 二,对于报文的理解 三,TCP协议 1&…

基于Geotools的Worldpop世界人口tif解析-以中国2020年数据为例

目录 前言 一、Worldpop数据简介 1、数据来源 2、QGIS数据展示 3、元数据展示 二、GeoTools人口解析 1、Maven依赖引入 2、Tif人口计算 三、总结 前言 在当今数字化与信息化飞速发展的时代,地理空间数据的分析与应用已然成为诸多领域研究与决策的关键支撑。…

Unity3D仿星露谷物语开发55之保存游戏到文件

1、目标 将游戏保存到文件,并从文件中加载游戏。 Player在游戏中种植的Crop,我们希望保存到文件中,当游戏重新加载时Crop的GridProperty数据仍然存在。这次主要实现保存地面属性(GridProperties)信息。 我们要做的是…

【无标题】C++23新特性:支持打印volatile指针

文章目录 前言背景与问题C23的解决方案实现原理使用场景硬件开发多线程调试 总结 前言 在C开发中,volatile关键字常用于修饰变量,以确保编译器不会对这些变量进行优化,从而保证程序能够正确地与硬件交互或处理多线程环境下的特殊变量。然而&…

【第4章 图像与视频】4.2 图像的缩放

文章目录 前言示例-图像的缩放在 Canvas 边界之外绘制图像 前言 在上节中读者已经学会了如何使用 drawImage() 方法将一幅未经缩放的图像绘制到 canvas 之中。现在我们就来看看如何用该方法在绘制图像的时候进行缩放 示例-图像的缩放 未缩放的图像,显示图形原有大…

敏捷开发中如何避免迭代失控

在敏捷开发过程中避免迭代失控,需要实施合理规划迭代目标、明确职责分工、强化沟通机制、严格控制需求变更等措施,其中合理规划迭代目标尤为重要,它确保团队聚焦于关键任务,避免因目标不清晰而导致的迭代混乱和失控。 一、合理规划…

Python开发AI智能体(九)———构建RAG对话应用

前言 上篇文章我们介绍了如何在Langchain中构建代理 这篇文章我们将带领大家构建一个RAG对话应用 一、什么是RAG对话应用? RAG(Retrieval-Augmented Generation,检索增强生成)技术通过从外部知识库检索相关信息,并将…

NW907NW918美光固态闪存NW920NW930

NW907NW918美光固态闪存NW920NW930 技术解析:美光NW系列固态闪存的核心突破 美光NW907、NW918、NW920、NW930四款固态闪存产品,代表了当前存储技术的顶尖水平。其核心创新在于G9 NAND架构的深度优化,采用更先进的5纳米制程工艺,…

【Deepseek 学网络互联】跨节点通信global 和节点内通信CLAN保序

Clan模式下的源端保序与Global类似,目的端保序则退化成通道保序,此时仅支持网络单路径保序。”这里的通道保序怎么理解? 用户可能正在阅读某种硬件架构文档(比如NVIDIA的NVLink或InfiniBand规范),因为"…

9.5 Q1 | 北京协和医学院GBD发文 | 1990-2021 年全球、区域和国家心力衰竭负担及其根本原因

1.第一段-文章基本信息 文章题目:Global, regional, and national burden of heart failure and its underlying causes, 1990-2021: results from the global burden of disease study 2021 中文标题:1990-2021 年全球、区域和国家心力衰竭负担及其根本…

根据Cortex-M3(包括STM32F1)权威指南讲解MCU内存架构与如何查看编译器生成的地址具体位置

首先我们先查看官方对于Cortex-M3预定义的存储器映射 1.存储器映射 1.1 Cortex-M3架构的存储器结构 内部私有外设总线:即AHB总线,包括NVIC中断,ITM硬件调试,FPB, DWT。 外部私有外设总线:即APB总线,用于…

MCP入门实战(极简案例)

MCP简介 MCP(Model Context Protocol,模型上下文协议)2024年11月底由 Antbropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。 Function Calling是AI模型调用函数的机制,MCP是一个标准协议,使AI模型与API无缝交互,而Al Agent是一个…