设计模式学习-使用go实现命令模式
命令模式
定义
命令模式(Command):将一个请求封装成一个对象,从而是你可用不同的的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
优点
1、降低了系统耦合度;
2、新的命令可以很容易添加到系统中去。
缺点
使用命令模式可能会导致某些系统有过多的具体命令类。
适用范围
1、如果你需要通过操作来参数化对象, 可使用命令模式。
2、如果你想要将操作放入队列中、 操作的执行或者远程执行操作, 可使用命令模式。
3、如果你想要实现操作回滚功能, 可使用命令模式。
命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等,这才是命令模式能发挥独一无二作用的地方。
代码实现
type Receiver struct {
}
func (*Receiver) Action() {
fmt.Println("执行命令")
}
type Command struct {
receiver Receiver
}
func NewCommand(receiver Receiver) *Command {
return &Command{
receiver: receiver,
}
}
type CommandImpl interface {
Execute()
}
type ConcreteCommand struct {
*Command
}
func NewConcreteCommand(receiver Receiver) *ConcreteCommand {
return &ConcreteCommand{
NewCommand(receiver),
}
}
func (cc *ConcreteCommand) Execute() {
cc.receiver.Action()
}
type Invoker struct {
command CommandImpl
}
func (ik *Invoker) ExecuteCommand() {
ik.command.Execute()
}
func (ik *Invoker) SetCommand(command CommandImpl) {
ik.command = command
}
测试文件
func TestNewCommand(t *testing.T) {
r := Receiver{}
concreteCommand := NewConcreteCommand(r)
invoker := Invoker{}
invoker.SetCommand(concreteCommand)
invoker.ExecuteCommand()
}
结构图

命令模式对比策略模式
对于一些相似的设计模式的区分,我们应该关注设计意图,应用场景的不同,而不是只看解决方案这一部分,或者只关注代码实现。单看实现,一些设计模式确实很相似,比较难区分。
从设计意图区分:
策略模式:不同的策略具有相同的目的、不同的实现、互相之间可以替换。
命令模式:不同的命令具有不同的目的,对应不同的处理逻辑,并且互相之间不可替换。
参考
【文中代码】https://github.com/boilingfrog/design-pattern-learning/tree/master/命令模式
【大话设计模式】https://book.douban.com/subject/2334288/
【极客时间】https://time.geekbang.org/column/intro/100039001
【命令模式】https://boilingfrog.github.io/2021/11/29/使用go实现命令模式/
设计模式学习-使用go实现命令模式的更多相关文章
- C#设计模式学习笔记:(14)命令模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第二个模式--命 ...
- .NET设计模式(17):命令模式(Command Pattern)(转)
概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- IOS设计模式学习(20)命令
1 前言 在面向对象中,把指令封装在各种命令对象中.命令对象可以被传递而且在指定时刻被不同的客户端复用.这一概念精心设计而来的设计模式叫做命令(Command)模式. 2 详述 2.1 简述 命令对象 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
- C#设计模式学习笔记:(22)备忘录模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8176974.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十个模式--备 ...
- 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)
1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...
- 设计模式总结篇系列:命令模式(Command)
在程序设计中,经常会遇到一个对象需要调用另外一个对象的某个方法以达到某种目的,在此场景中,存在两个角色:请求发出者和请求接收者.发出者发出请求,接收者接收请求并进行相应处理.有时候,当需要对请求发出者 ...
随机推荐
- Tomcat--启动慢
本篇为转载文章 来自:https://www.cnblogs.com/user-sunli/articles/13917035.html 有时启动Tomcat,发现启动很慢,需要几分钟,这个问题值得重 ...
- IDC《中国边缘云市场解读 (2022)》:阿里云蝉联中国公有云市场第一
国际权威咨询公司IDC发布<中国边缘云市场解读(2022 )>报告,中国边缘公有云服务市场,阿里云蝉联第一. 市场蝉联第一,"边缘"生长强劲 近期,全球领先的IT市场研 ...
- 阿里云视频云vPaaS低代码音视频工厂:极速智造,万象空间
当下音视频技术越来越广泛地应用于更多行各业中,但因开发成本高.难度系数大等问题,掣肘了很多企业业务的第二增长需求.阿里云视频云基于云原生.音视频.人工智能等先进技术,提供易接入.强拓展.高效部署和覆盖 ...
- Linux 安装Jupyter notebook 并开启远程访问
一. Ubuntu下安装jupyter notebook 1. 使用Anaconda安装 conda install jupyter notebook 2. 使用pip安装 pip install j ...
- AtCoder Beginner Contest 203 (A~D,玄学二分场)
补题链接:Here A - Chinchirorin 给出 \(a,b,c\) 三个正整数,现请打印各种情况的答案: \(a=b=c\) ,输出一个即可 \(a = b\ and\ a != c\) ...
- @Constraint注解,做特殊的入参校验
// @Constraint 是 Java 中的注解之一,用于标记自定义的约束注解.约束注解通常用于数据验证,用来限制字段的取值或格式,确保数据的合法性. @Constraint(validatedB ...
- 12、SpringBoot-mybatis-plus-ehcache
系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...
- token原理分析
- joi
- idea 解决git更新冲突
转载请注明出处: 对使用idea工具解决git冲突,最近有发现不同的解决冲突的方法,都很快捷方便,记录一下. 1.先commit 再pull,然后手动进行merge 左边部分是本地仓库的代码,右边部分 ...