设计模式go语言实现----命令模式command

Go-command-Go命令模式用于线程安全的串行和并行调度程序 command - Go命令模式用于线程安全的串行和并行调度程序 立即下载

1 定义

命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

模式动机:
命令模式可以将发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
UML类图:
在这里插入图片描述
命令模式包含以下四个角色:

  • Receiver(接收者): 接收者执行与请求相关的操作,它具体实现对请求的业务处理。
  • Invoker(调用者):请求发送者,通过命令对象来执行请求。
  • Command(抽象命令类):一个抽象类或接口,声明了执行请求的Execute()方法,通过这些方法可以调用请求接收者的相关操作
  • ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了抽象命令类中声明的方法。在实现Execute()方法时,将调用接收者对象的相关操作(Action)

下面以电视机为例实现这个命令模式,其UML类图如下:
在这里插入图片描述

2 go语言实现

2.1 Receiver角色实现

type TV struct{}

func (tv TV) Open() {
	fmt.Println("开机")
}

func (tv TV) Close() {
	fmt.Println("关机")
}

func (tv TV) ChangeChannel() {
	fmt.Println("换台")
}

2.2 Command以及ConcreteCommand角色实现

type Command interface {
	Execute()
}

type OpenCommand struct {
	receiver TV
}

func (oc OpenCommand) Execute() {
	oc.receiver.Open()
}

type CloseCommand struct {
	receiver TV
}

func (cc CloseCommand) Execute() {
	cc.receiver.Close()
}

type ChangeChannelCommand struct {
	receiver TV
}

func (ccc ChangeChannelCommand) Execute() {
	ccc.receiver.ChangeChannel()
}

2.3 Invoker角色实现

type Invoke struct {
	Command
}

func (i Invoke) ExecuteCommand() {
	i.Command.Execute()
}

2.4 定义工厂方法创建Command

func NewCommand(t string, tv TV) Command {
	switch t {
	case "open":
		return OpenCommand{
			receiver: tv,
		}
	case "close":
		return CloseCommand{
			receiver: tv,
		}
	case "changechannel":
		return ChangeChannelCommand{
			receiver: tv,
		}
	default:
		return nil
	}
}

2.5 客户端调用

func main() {
	//创建一个Reveiver
	tTV := command.TV{}
	//创建一个Command
	tCommand := command.NewCommand("open", tTV)
	//创建一个调用者
	tInvoke := command.Invoke{
		Command: tCommand,
	}
	tInvoke.ExecuteCommand()

	tCommand = command.NewCommand("changechannel", tTV)

	tInvoke = command.Invoke{
		Command: tCommand,
	}
	tInvoke.ExecuteCommand()

	tCommand = command.NewCommand("close", tTV)

	tInvoke = command.Invoke{
		Command: tCommand,
	}
	tInvoke.ExecuteCommand()
}
从零搭建ROS机械臂仿真环境:Ubuntu 20.04+Noetic下配置睿尔曼RM65的完整流程 本文详细介绍了在Ubuntu 20.04系统中,基于ROS Noetic搭建睿尔曼RM65机械臂的完整仿真环境。从环境准备、工作空间创建到MoveIt!配置与Gazebo仿真环境集成,提供了完整的流程和优化建议,帮助开发者高效实现机械臂仿真与调试。 阅读详情

相关推荐

R语言绘图进阶:五大工具高效组合多图(cowplot、patchwork、layout、par、gridExtra)

本文详细介绍了R语言中五大高效组合多图的工具:cowplot、patchwork、layout、par和gridExtra。针对不同场景提供了实用指南,帮助数据分析师解决图表排版难题,提升报告专业度。特别推荐cowplot用于ggplot2图形组合,patchwork提供最简洁语法,layout则支持完全自定义布局。

weixin_42544663的博客 288

gocommand:一个跨平台的golang命令行执行package

最近在做一个项目的时候,需要使用golang来调用操作系统中的命令行,来执行shell命令或者直接调用第三方程序,这其中自然就用到了golang自带的exec.Command. 但是如果直接使用原生exec.Command会造成大量的重复代码,网上搜了一圈又没有找到对exec.Command相应的封装包,索性自己封装了一个,取名为gocommand.目前支持Linux和Windo...

weixin_30548917的博客 553

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3007

Go语言执行cmd命令库

Go语言执行cmd命令库

YIYIYI 5649

vivado 工程修改芯片型号

vivado工程芯片与实际板子不匹配时,需要修改工程的芯片型号,并对原工程的ip进行同步更新,之后生成新的bit文件,烧录到板子中

k7126685的博客 1万+

多孔材料吸附性质模拟程序RASPA的离线和在线安装方法

RASPA-2.0是今年美国西北大学教授Randall Q. Snurr等人开发的针对于MC,MD,分子力学优化等用途的程序,相比于之前开发的MUSIC软件,RASPA的功能更加齐全,操作更加简便,可以在MC的吸附过程中考虑骨架的柔性,也可以想MUSIC一样先制作积分格点(music中的map)。 A、离线安装(centos为例): (1)、安装之前要检查一下是否装了automake,

youyno的博客 1万+

Go讲解设计模式:命令模式

首先,我们需要定义一个Command接口,该接口声明了所有命令应该实现的方法。// Command 定义命令的基本操作接口Execute()

软件架构师笔记 896

保姆级教程:用TI IWR6843雷达板跑通3D人体追踪demo(附CCS/UniFlash避坑指南)

本文提供了一份详尽的TI IWR6843毫米波雷达开发板3D人体追踪demo实现指南,涵盖开发环境搭建、工程导入编译、固件烧录及可视化工具配置全流程。特别针对CCS和UniFlash使用中的常见问题给出解决方案,帮助开发者快速掌握3D People Tracking技术应用。

weixin_29159441的博客 501

go 学习笔记(1)go command

常用命令 go command [arguments] 1) go build 跨平台编译: env GOOS=linux GOARCH=amd64 go build 2) go install : 与go build最大的区别是编译后将输出文件打包成库放在pkg下 3) go get : 用于获取go 的第三方包,通常会默认从git repo上pu...

weixin_30814319的博客 315

uniapp(全端兼容)-最新详细实现接入腾讯云IM即时通讯教程,uniapp在安卓苹果app端/小程序/h5移动端等集成使用腾讯云im插件,提供消息列表与聊天对话示例,支持发图片/私聊/实时监听消息

uni-app,腾讯云IM,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,im即时通讯,腾讯云IM详细教程,如何接入腾讯IM即时通讯,使用腾讯im有没有插件,怎么使用腾讯云IM插件,tim-wx-sdk,聊天sdk,即时通讯im uniapp私聊/群聊/聊天室,实现IM即时通讯仿微信聊天功能,对接腾讯云IM+音视频,调用腾讯即时通信IM的示例,卡顿很卡不流畅,音视频,全局监听,仿微信IM,uni-huanxin-im,sdk,实现多端实时通

✅ 精选推荐文章 1万+

智算中心建设项目初步设计方案

本项目面向区级政府、智算中心及文旅从业者,聚焦某区智算中心一期建设,响应数字经济与智慧城市建设政策,推动文旅产业升级。遵循统筹规划、数据驱动原则,目标打造智慧文旅样板。建设内容涵盖云网数据底座(以租代建)、数据中台(全生命周期管理)、智慧文旅平台(含“一机游”电商)及气象监测等配套,采用前后端架构与低代码开发,强化三级等保与纵深防御,实现安全可控。方案融合多类资源目录,提供从设计到运营的完整技术支撑,助力区域智算与文旅深度融合。

cdfunlove的博客 111

Go?Go!(四) Go command的使用

本篇文档应该是第一篇文档的补充,笔者还还不是特别了解Go的使用的时候就盲目的去做安装和学习,绝对是一个失败的案例。。。 对于一般情况,使用Go只需要安装Go即可,不需要gccgo的安装,那个真的很慢,而且有一个最大的问题是没有go的支持。 go是一个有点强大的工具,可以安装包,测试包,从网上下载并安装包,还有一些附带的小工具,objdump什么的,都很好用。 对于go的使用,可以参照文档:h

hitrose27的专栏 2164

华为OD机考双机位C卷 - 敌情监控 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 敌情监控 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 964

Golang学习笔记_44——命令模式

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

LuckyLay的博客 1400

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Go实现】实践GoF的23种设计模式:命令模式

命令模式可将请求转换为一个包含与请求相关的所有信息的对象, 它能将请求参数化、延迟执行、实现 Undo / Redo 操作等

ruanrunxue的博客 849

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

实践GoF的23种设计模式:命令模式

命令模式可将请求转换为一个包含与请求相关的所有信息的对象, 它能将请求参数化、延迟执行、实现 Undo / Redo 操作等。

华为云官方博客 1474

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Golang - 命令模式(Command Pattern)

命令模式摘要 命令模式将请求封装为独立对象,实现调用者与接收者的解耦。核心思想是把"直接执行操作"变为"创建命令对象",带来以下优势: 解耦调用者与接收者:调用者只需执行命令,无需知道具体实现 支持撤销/重做:命令对象可保存状态,实现Undo操作 支持命令组合:宏命令可打包多个操作 支持延迟执行:命令可放入队列,按需调度 模式包含四个角色: Command:定义执行接口 ConcreteCommand:绑定接收者和具体操作 Invoker:触发命令执行 Receiver:实际执行操作的对象 在Go中利用函数

csdnUser12的博客 394

撤销与重做?我用命令模式和lua实现了此功能。

一、命令模式 二、原理 三、案例 四、用lua的实现

岁月相伴 582

设计模式——Go语言(Golang)版:22_命令模式

示例代码: package main import "fmt" type Command interface { Execute() } type MotherBoard struct{} func (*MotherBoard) Start() { fmt.Println("系统启动中...") } func (*MotherBoard) Reboot() { fmt.Println("系统重启中...") } //====启动命令===== type StartCommand struc

weixin_42117918的博客 424

【设计模式】20、command 命令模式

在 client 和 object 之间增加一个 command 层, 可以延迟执行 或 远程执行

呆呆的猫的博客 350

设计模式--命令(Command)模式

模式定义 将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作 类图 要点总结 Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象” 实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息,通过使用Composite模式,可以将多个“命令”封装为一个“复合命令”MacroCommand Go语言代码实现 工程目

weixin_38299404的博客 344

Go语言实现GoF设计模式:备忘录模式的实践探索

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外进行保存,以便在未来将对象恢复到原先保存的状态。

华为云官方博客 752

Go设计模式入门指南:命令与备忘录模式详解,2种方法实现撤销操作与状态快照

go-patterns 是一个面向 Go 语言的设计模式示例库,按创建型、结构型、行为型三大类组织经典设计模式的完整实现。本文聚焦其 `behavioral` 包中的两个行为型模式——**命令模式(Command)** 与**备忘录模式(Memento)**,带你用这两种方法实现撤销操作与状态快照,为你的 Go 程序加上一颗"后悔药" 🍬 [![Go设计模式命令模式与备忘录模式拼图示例](ht

gitblog_00277的博客 744

【命令设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

命令模式(Command Pattern)是一种数据驱动的设计模式,也是一种行为型设计模式。这种模式的请求以命令的形式包裹在对象中,并传给调用对象。调用对象再寻找合适的对象,并把该命令传给相应的处理者。即把请求或操作封装成单个对象,并使其可以被参数化和延迟执行,这种方式将命令和执行者进行了有效解耦。如果你需要通过操作来参数化对象,可使用命令模式。如果你想要将操作放入队列中、操作的执行或者远程执行操作, 可使用命令模式。如果你想要实现操作回滚功能,可使用命令模式。

235

大话设计模式 -- Golang实现

DesignPatternUse GO language to achieve 23 design patterns 该项目是拜读《大话设计模式》后,学习Golang语言实现的,有很多不足之处,有待完善 有些模式是根据UML图编写的基本框架,有些是基于特定的环境下编写的实例创建型模式 Abstract Factory抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的

aa779025105的专栏 7878

C++设计模式之行为型模式:命令模式(Command)

基于Kafka+ElasticSearch+MongoDB+Redis+XXL-Job日志分析系统(学习)配置即权限:从传统开源 RBAC 框架到 SPARK 的六层数据护盾,告别改权限就要改代码的魔咒。c++&MFC 用boost.asio库写的串口功能,包含发送、异步接收、打开、重连、关闭功能。Windows下NVM保姆级指南:安装、切换版本、指定路径+淘宝镜像配置,一次搞定!第2集:技术选型的智慧:Flask vs FastAPI,GLM-4 vs GPT。

slngX_1wv5a的博客 314
上一篇: 设计模式go语言实现----代理模式proxy
下一篇: 设计模式go语言实现----中介者模式mediator
cloudUncle
博客等级 码龄8年 21粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值