Golang设计模式——06命令模式

命令模式

定义

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

优点

  1. 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
  2. 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
  3. 可以将相关操作抽象成命令,使调用者与实现者相关分离。

缺点

  1. 使用命令模式会导致系统中有过多的具体命令类。因为针对一种命令实现一个命令类。

场景

认为是命令的地方都可以使用命令模式。

代码

在这里插入图片描述

package Command

import "fmt"

type Receiver interface {
	Action()
}

type Receiver1 struct {
}

func (r *Receiver1) Action() {
	fmt.Println("执行命令1")
}

type Receiver2 struct {
}

func (r *Receiver2) Action() {
	fmt.Println("执行命令2")
}

type Receiver3 struct {
}

func (r *Receiver3) Action() {
	fmt.Println("执行命令3")
}

type Command interface {
	Execute()
}
type ConcreteCommand1 struct {
	receiver Receiver
}

func (c *ConcreteCommand1) Execute() {
	c.receiver.Action()
}

type ConcreteCommand2 struct {
	receiver Receiver
}

func (c *ConcreteCommand2) Execute() {
	c.receiver.Action()
}

type ConcreteCommand3 struct {
	receiver Receiver
}

func (c *ConcreteCommand3) Execute() {
	c.receiver.Action()
}

type Invoker struct {
	commands []Command
}

func (i *Invoker) SetCommand(command Command) {
	i.commands = append(i.commands, command)
}
func (i *Invoker) ExecuteCommand() {
	for _, c := range i.commands {
		c.Execute()
	}
}

package Command

import "testing"

func TestInvoker_ExecuteCommand(t *testing.T) {

	c1 := ConcreteCommand1{&Receiver1{}}
	c2 := ConcreteCommand1{&Receiver2{}}
	c3 := ConcreteCommand1{&Receiver3{}}

	i := Invoker{}
	i.SetCommand(&c1)
	i.SetCommand(&c2)
	i.SetCommand(&c3)
	i.ExecuteCommand()
}

其他设计模式

设计模式Git源代码
00简单工厂模式
01工厂方法模式
02抽象工厂模式
03外观模式
04建造者模式
05桥接模式
06命令模式
07迭代器模式
08模板模式
09访问者模式
10备忘录模式
11责任链模式
12中介模式
13原型模式
14状态模式
15策略模式
16享元模式
17组合模式
18解释器模式
19单例模式
20适配器模式
21代理模式
22装饰器模式
23观察者模式

posted @ 2021-09-24 19:24  cheems~  阅读(29)  评论(0编辑  收藏  举报