[go] 命令模式

ops/2024/9/22 13:34:38/

命令模式

  • 将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
    模型说明

  • 触发者类负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。触发命令,而不同接受者直接发送请求。注意,发送者并不负责创建命令对象:它通常会通过构造函数从客户端处获得预先生成的命令。

  • 命令接口通常仅声明一个执行命令的方法。

  • 具体命令会实现各种类型的请求。具体命令自身并不完成工作,而是会将调用委派给一个业务逻辑对象。但为了简化代码,这些类可以进行合并。

  • 接收对象执行方法所需的参数可以声明为具体命令的成员变量。可以将命令对象设为不可变,仅允许通过构造函数对这些成员变量进行初始化。

  • 接收者类包含部分业务逻辑。几乎任何对象都可以作为接收者。绝大部分命令只处理如何将请求传递到接收者的细节,接收者自己会完成实际的工作。

  • 客户端会创建并配置具体命令对象。客户端必须将包括接收者实体在哪的所有请求参数传递给命令的构造函数。此后,生成的命令就可以与一个或多个发送者相关联。

优缺点

1.优点

  • 单一职责原则。 你可以解耦触发和执行操作的类。
  • *开闭原则。*你可以在不修改已有客户端代码的情况下在程序中创建新的命令。
  • 你可以实现撤销和恢复功能。
  • 你可以实现操作的延迟执行。
  • 你可以将一组简单命令组合成一个复杂命令。

2.缺点

  • 代码可能会变得更加复杂, 因为你在发送者和接收者之间增加了一个全新的层次。

使用场景

  • 如果你需要通过操作来参数化对象, 可使用命令模式
  • 如果你想要将操作放入队列中、 操作的执行或者远程执行操作, 可使用命令模式
  • 如果你想要实现操作回滚功能, 可使用命令模式

参考代码

// command.go
// 命令接口
type command interface {execute()undo()
}
// concrete_command.go
// 具体命令
type light struct{}func (l *light) label() string {return "light"
}func (l *light) on() {fmt.Println("light is on")
}func (l *light) off() {fmt.Println("light is off")
}type lightOnCommand struct {l *light
}func (c *lightOnCommand) execute() {c.l.on()
}func (c *lightOnCommand) undo() {c.l.off()
}type lightOffCommand struct {l *light
}func (c *lightOffCommand) execute() {c.l.off()
}func (c *lightOffCommand) undo() {c.l.on()
}const (labelNoCommand = "on_command"
)type noCommand struct{}func (n *noCommand) execute() {fmt.Println("no command executed")
}func (n *noCommand) undo() {fmt.Println("no command undo")
}
// invoker.go
// 触发者
type remoteController struct {onCommands  map[string]commandoffCommands map[string]commandpreCmd      command
}func createSimpleRemoteController() *remoteController {rc := &remoteController{onCommands:  make(map[string]command),offCommands: make(map[string]command),}// 这里处理为了没有找到插槽时的表现noCMD := new(noCommand)rc.onCommands[labelNoCommand] = noCMDrc.offCommands[labelNoCommand] = noCMD// 初始化的时候,没有上一次点击的按钮,所以使用 noCommandrc.preCmd = noCMDreturn rc
}func (rc *remoteController) setCommand(label string, onCMD, offCMD command) {rc.onCommands[label] = onCMDrc.offCommands[label] = offCMD
}func (rc *remoteController) onButtonWasPressed(label string) {cmd := rc.onCommands[label]if cmd == nil {cmd = rc.onCommands[labelNoCommand]}cmd.execute()rc.preCmd = cmd
}func (rc *remoteController) offButtonWasPressed(label string) {cmd := rc.offCommands[label]if cmd == nil {cmd = rc.offCommands[labelNoCommand]}cmd.execute()rc.preCmd = cmd
}func (rc *remoteController) undo() {rc.preCmd.undo()
}
// main.go
// 客户端
func main() {simpleLight := new(light)lightOnCmd := &lightOnCommand{l: simpleLight}lightOffCmd := &lightOffCommand{l: simpleLight}rc := createSimpleRemoteController()rc.setCommand(simpleLight.label(), lightOnCmd, lightOffCmd)rc.onButtonWasPressed(simpleLight.label())rc.offButtonWasPressed(simpleLight.label())rc.undo()rc.onButtonWasPressed("coffeeMachine")
}

输出:

light is on 
light is off 
light is on 
no command executed

http://www.ppmy.cn/ops/114265.html

相关文章

深度学习02-pytorch-06-张量的形状操作

在 PyTorch 中,张量的形状操作是非常重要的,可以让你灵活地调整和处理张量的维度和数据结构。以下是一些常用的张量形状函数及其用法,带有详细解释和举例说明: 1. reshape() 功能: 改变张量的形状,但不改变数据的顺序…

C#描述-计算机视觉OpenCV(6):形态学

C#描述-计算机视觉OpenCV(6):形态学 前言阈值化二值图像腐蚀与膨胀算法形态学滤波器开启和闭合运算原理概括 前言 这是本系列第六节,主要是介绍基础的形态学运用。 形态学主要是分析图像中不同主题的形态,它定义了一系…

基于SpringBoot+Vue的宠物医院管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

unity 高性能对象池解决方案

对于一个高性能对象池应该有的功能: 支持多种对象、同步加载、异步加载、隐藏方式、自动收缩(使用LRU缓存机制,最近最久未使用来进行收缩)、异步删除 所以我针对这几个功能讲一下原理: 支持多种对象: G…

Spring Session

Session 共享问题 在 Web 项目开发中,Session 会话管理是一个很重要的部分,用于存储与记录用户的状态或相关的数据。 通常情况下 session 交由容器(tomcat)来负责存储和管理,但是如果项目部署在多台 tomcat 中&#…

某文书网爬虫逆向

一、抓包分析 请求参数和响应数据都有加密 二、逆向分析 老方法、下xhr断点 加密实现逻辑都在这个方法里 执行到这的时候,在向下跟栈数据就已经渲染出来了,说明是在这个方法里进行的解密 解密方法,data.result为加密数据,data.s…

MyBatis 源码解析:Mapper 文件加载与解析

引言 在 MyBatis 中,Mapper 文件扮演了至关重要的角色,它通过 SQL 映射文件来定义数据库查询操作和 Java 对象之间的映射关系。Mapper 文件通常是以 XML 格式存储的,包含了 SQL 语句以及与 Java 对象的对应关系。在本篇文章中,我…

Java异常架构与异常关键字

1. Java异常简介 Java 异常是 Java 提供的一种识别及响应错误的一致性机制。 Java 异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程 序健壮性。在有效使用异常的情况下,异常能清晰的回答 what, where,…