ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式学习-使用go实现命令模式

2021-11-29 13:31:42  阅读:158  来源: 互联网

标签:Receiver 模式 命令 Command func receiver 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()
}

结构图

command

命令模式对比策略模式

对于一些相似的设计模式的区分,我们应该关注设计意图,应用场景的不同,而不是只看解决方案这一部分,或者只关注代码实现。单看实现,一些设计模式确实很相似,比较难区分。

从设计意图区分:

策略模式:不同的策略具有相同的目的、不同的实现、互相之间可以替换。

命令模式:不同的命令具有不同的目的,对应不同的处理逻辑,并且互相之间不可替换。

参考

【文中代码】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实现命令模式/

标签:Receiver,模式,命令,Command,func,receiver,go,设计模式
来源: https://www.cnblogs.com/ricklz/p/15618983.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有