自助免费网站制作/免费隐私网站推广app

自助免费网站制作,免费隐私网站推广app,中铁建设企业门户,做网站的设计理念Golang学习笔记_41——观察者模式 Golang学习笔记_42——迭代器模式 Golang学习笔记_43——责任链模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 事务管理系统2. 多媒体遥控器3. 操作审计系统 四、Go语言实现示例五、高级应用…

Golang学习笔记_41——观察者模式
Golang学习笔记_42——迭代器模式
Golang学习笔记_43——责任链模式


文章目录

    • 一、核心概念
      • 1. 定义
      • 2. 解决的问题
      • 3. 核心角色
      • 4. 类图
    • 二、特点分析
    • 三、适用场景
      • 1. 事务管理系统
      • 2. 多媒体遥控器
      • 3. 操作审计系统
    • 四、Go语言实现示例
    • 五、高级应用
      • 1. 宏命令系统
      • 2. 异步命令队列
    • 六、与其他模式对比
    • 七、实现建议
    • 八、典型应用


一、核心概念

1. 定义

命令模式是一种行为型设计模式,通过将请求封装为独立对象实现调用者与执行者的解耦,支持请求的队列化、撤销重做和事务管理。其核心特点包括:
请求对象化:将操作抽象为可传递的命令对象
解耦调用链:调用者无需了解具体执行细节
操作可编排:支持命令的组合与顺序控制

2. 解决的问题

系统紧耦合:消除行为请求者与实现者的直接依赖
操作不可逆:缺乏标准化的撤销/重做机制
事务原子性:多步骤操作无法保证整体执行

3. 核心角色

角色作用
Command定义执行操作的统一接口(Execute/Undo)
ConcreteCommand实现具体命令逻辑,绑定接收者对象
Invoker触发命令执行,支持命令存储与调度
Receiver实际执行业务操作的对象
Client组装命令对象与接收者的关系

4. 类图

命令模式类图

@startuml
' 命令模式类图interface Command {+execute(): void
}class Invoker {-command: Command+setCommand(command: Command): void+executeCommand(): void
}class ConcreteCommand {-receiver: Receiver+execute(): void
}class Receiver {+action(): void
}' 关系定义
Command <|.. ConcreteCommand
Invoker o--> Command
ConcreteCommand --> Receiver
Receiver <.. ConcreteCommand : <<create>>note left of Command定义执行操作的接口
end notenote right of Receiver实际执行操作的对象
end note
@enduml

二、特点分析

优点

  1. 解耦架构:彻底分离请求发起方与执行方
  2. 可扩展性:新增命令不影响现有系统
  3. 事务支持:支持多命令原子操作与回滚

缺点

  1. 类膨胀:每个命令需独立类实现
  2. 执行开销:间接调用带来性能损耗
  3. 复杂度:需处理命令生命周期管理

三、适用场景

1. 事务管理系统

// 转账命令示例
type TransferCommand struct {from   *Accountto     *Accountamount int
}func (t *TransferCommand) Execute() {t.from.Debit(t.amount)t.to.Credit(t.amount)
}func (t *TransferCommand) Undo() {t.from.Credit(t.amount)t.to.Debit(t.amount)
}

(实现资金划转与回滚,参考的撤销实现)

2. 多媒体遥控器

type TVPowerCommand struct {tv *Television
}func (c *TVPowerCommand) Execute() {if c.tv.IsOn {c.tv.TurnOff()} else {c.tv.TurnOn()}
}

3. 操作审计系统

type AuditLog struct {commands []Command
}func (a *AuditLog) Record(cmd Command) {a.commands = append(a.commands, cmd)cmd.Execute()
}

四、Go语言实现示例

示例类图

完整实现代码

package command_demoimport "fmt"// Command 接口
type Command interface {Execute()
}// Receiver 实现
type StockTrade struct{}func (s *StockTrade) Buy() {fmt.Println("买入股票")
}func (s *StockTrade) Sell() {fmt.Println("卖出股票")
}// ConcreteCommand 具体命令
type BuyStock struct {stock *StockTrade
}func (b *BuyStock) Execute() {b.stock.Buy()
}type SellStock struct {stock *StockTrade
}func (s *SellStock) Execute() {s.stock.Sell()
}// Invoker 调用者
type Broker struct {orders []Command
}func (b *Broker) TakeOrder(cmd Command) {b.orders = append(b.orders, cmd)
}func (b *Broker) PlaceOrders() {for _, cmd := range b.orders {cmd.Execute()}b.orders = nil
}// 客户端代码
func Example() {stock := &StockTrade{}buy := &BuyStock{stock: stock}sell := &SellStock{stock: stock}broker := &Broker{}broker.TakeOrder(buy)broker.TakeOrder(sell)broker.PlaceOrders()
}

执行结果

=== RUN   TestExample
买入股票
卖出股票
--- PASS: TestExample (0.00s)
PASS

五、高级应用

1. 宏命令系统

type MacroCommand struct {commands []Command
}func (m *MacroCommand) Execute() {for _, cmd := range m.commands {cmd.Execute()}
}// 使用示例
macro := &MacroCommand{commands: []Command{&SaveCommand{},&CompileCommand{},&DeployCommand{},},
}
macro.Execute()

2. 异步命令队列

type AsyncInvoker struct {queue chan Command
}func (a *AsyncInvoker) Start() {go func() {for cmd := range a.queue {cmd.Execute()}}()
}func (a *AsyncInvoker) Add(cmd Command) {a.queue <- cmd
}

六、与其他模式对比

模式核心区别典型应用场景
策略模式算法选择 vs 操作封装支付方式选择
职责链模式请求传递 vs 命令执行审批流程处理
备忘录模式状态存储 vs 操作记录编辑器撤销功能

七、实现建议

  1. 轻量化设计:使用闭包简化简单命令
    func NewLightCmd(light *Light) Command {return CommandFunc(light.Toggle)
    }
    
  2. 生命周期管理:实现Release()方法释放资源
  3. 批量操作:采用组合模式实现命令集合操作
  4. 错误处理:增加Validate()预处理方法

八、典型应用

  1. 文本编辑器:实现编辑操作撤销栈
  2. 智能家居:物联网设备控制中心
  3. 金融交易:多步骤交易事务管理
  4. 游戏开发:玩家操作回放系统

通过命令模式,可以将分布式系统的操作请求转化为可序列化对象,实现跨网络的操作重放与审计。在Go语言中,结合channel特性可构建高性能命令管道,适用于实时交易系统等场景。建议对高频操作命令采用对象池优化,避免重复创建开销。

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

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

相关文章

应急响应--流量分析

&#xff08;一&#xff09;Cobalt Strike流量特征分析 1.HTTP特征 源码特征&#xff1a; 在流量中&#xff0c;通过http协议的url路径&#xff0c;在checksum8解密算法计算后&#xff0c;32位的后门得到的结果是92&#xff0c;64位的后门得到的结果是93&#xff0c;该特征符…

CI/CD—Jenkins配置一次完整的jar自动化发布流程

背景&#xff1a; 实现设想&#xff1a; 要创建自动化发布&#xff0c;需要准备一台测试服务器提前安装好java运行所需的环境&#xff0c;JDK版本最好和Windows开发机器上的版本一致&#xff0c;在Jenkins上配置将构建好的jar上传到测试服务器上&#xff0c;测试服务器自动启动…

创建分区表ORA-14037

1、故障现象 在跑脚本的时候创建物化试图提示分区界限过高 2、解决方法 最终原因是&#xff1a;缺少了 这个 r34411分区&#xff0c;加上就好。 判断是物化视图创建的时候需要兼容所有分区的数据&#xff0c;所以报错&#xff0c;而分区表则不存在这种情况 3、测试验证 分区…

基于51单片机多功能防盗报警系统

基于51单片机多功能防盗报警系统( proteus仿真程序设计报告原理图讲解视频&#xff09; 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接 仿真图proteus8.9及以上 程序编译器&#xff1a;keil 4/…

R语言和RStudio安装

整体还是比较简单的&#xff0c;主要是记录个流程。 官方镜像站列表R语言官网 1 安装R&#xff08;2025/3/6&#xff09; R语言官网&#xff1a;The R Project for Statistical Computing 打开之后就Hello world一下吧 配置环境变量 2 安装RStudio 下载地址&#xff1a;htt…

Ubuntu 22.04 升级到 Ubuntu 24.04 全流程指南

&#x1f4cc; 1. 前言 Ubuntu 24.04 是最新的 LTS 版本&#xff0c;带来了内核更新、性能优化以及更强的安全性。本指南详细记录了从 Ubuntu 22.04 升级到 24.04 的完整过程&#xff0c;包括 升级前的准备、遇到的问题及如何选择最佳选项&#xff0c;避免升级失败或系统损坏。…

CI/CD—Jenkins配置Maven+GitLab自动构建jar包

一、安装Maven插件通过Maven构建项目 1、在Jenkins上安装Maven Integration plugin插件 2、创建一个maven项目 2.1、填写构建的名称和描述等 2.2、填写连接git的url 报错&#xff1a;无法连接仓库&#xff1a;Error performing git command: git ls-remote -h http://192.168.…

【数据结构】初识集合框架及背后的数据结构(简单了解)

目录 前言 如何学好数据结构 1. 什么是集合框架 2. 集合框架的重要性 3. 背后所涉及的数据结构以及算法 3.1 什么是数据结构 3.2 容器背后对应的数据结构 3.3 相关java知识 3.4 什么是算法 3.5 基本关系说明&#xff08;重要&#xff0c;简单了解&#xff09; 前言 …

P9242 [蓝桥杯 2023 省 B] 接龙数列--DP【巧妙解决接龙问题】

P9242 [蓝桥杯 2023 省 B] 接龙数列--DP 题目 解析什么时候该用 DP&#xff1f;动态规划 vs 其他方法代码 题目 解析 这题没思路&#xff0c;压根没想到DP &#x1f626; 看了大神的题解&#xff0c;利用dp记录每一个数结尾的长度&#xff0c;最后再用N-dp中的最大值&#xf…

Ubuntu切换lowlatency内核

文章目录 一. 前言二. 开发环境三. 具体操作 一. 前言 低延迟内核&#xff08;Lowlatency Kernel&#xff09; 旨在为需要低延迟响应的应用程序设计的内核版本。Linux-lowlatency特别适合音频处理、实时计算、游戏和其他需要及时响应的实时任务。其主要特点是优化了中断处理、调…

基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程

一、Django项目初始化 1.创建Django项目 Django-admin startproject 项目名 2.安装 djangorestframework pip install djangorestframework 解释: Django REST Framework (DRF) 是基于 Django 框架的一个强大的 Web API 框架&#xff0c;提供了多种工具和库来构建 RESTf…

VUE3开发-9、axios前后端跨域问题解决方案

VUE前端解决跨域问题 前端页面需要改写 如果无效&#xff0c;记得重启服务器 后端c#解决跨域问题 前端js取值&#xff0c;后端c#跨域_c# js跨域-CSDN博客

PY32MD320单片机 QFN32封装,内置多功能三相 NN 型预驱。

PY32MD320单片机是普冉半导体的一款电机专用MCU&#xff0c;芯片采用了高性能的 32 位 ARM Cortex-M0 内核&#xff0c;主要用于电机控制。PY32MD320嵌入高达 64 KB Flash 和 8 KB SRAM 存储器&#xff0c;最高工作频率 48 MHz。PY32MD320单片机的工作温度范围为 -40 ~ 105 ℃&…

OpenManus介绍及本地部署体验

1.OpenManus介绍 OpenManus&#xff0c;由 MetaGPT 团队精心打造的开源项目&#xff0c;于2025年3月发布。它致力于模仿并改进 Manus 这一封闭式商业 AI Agent 的核心功能&#xff0c;为用户提供无需邀请码、可本地化部署的智能体解决方案。换句话说&#xff0c;OpenManus 就像…

【贪心算法】简介

1.贪心算法 贪心策略&#xff1a;解决问题的策略&#xff0c;局部最优----》全局最优 &#xff08;1&#xff09;把解决问题的过程分成若干步 &#xff08;2&#xff09;解决每一步的时候&#xff0c;都选择当前看起来的“最优”的算法 &#xff08;3&#xff09;“希望”得…

springboot知识点以及源码解析(2)

web开发--静态规则与定制化 springboot对静态资源的映射规则&#xff1a;在类路径下面定义目录static或public或resources或者META-INF/resources&#xff0c;访问时项目根目录静态资源的名称 在springboot中&#xff0c;如果项目中存在同名的静态资源和同名的动态资源。那么我…

C++:string容器(下篇)

1.string浅拷贝的问题 // 为了和标准库区分&#xff0c;此处使用String class String { public :/*String():_str(new char[1]){*_str \0;}*///String(const char* str "\0") // 错误示范//String(const char* str nullptr) // 错误示范String(const char* str …

使用 vxe-table 导出 excel,支持带数值、货币、图片等带格式导出

使用 vxe-table 导出 excel&#xff0c;支持带数值、货币、图片等带格式导出&#xff0c;通过官方自动的导出插件 plugin-export-xlsx 实现导出功能 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;htt…

JavaScript数据类型和内存空间

一、JavaScript 数据类型 基本数据类型&#xff1a;字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol 引用数据类型&#xff1a;对象(Object)、数组(Array)、函数(Fun…

python中采用opencv作常规的图片处理的方法~~~

在python中&#xff0c;我们经常会需要对图片做灰度/二值化/模糊等处理&#xff0c;这时候opencv就是我们的好帮手了&#xff0c;下面我来介绍一下相关用法: 首先&#xff0c;需要安装opencv-python库: 然后&#xff0c;在你的代码中引用: import cv2 最后就是代码了&#x…