Golang设计模式——06命令模式
命令模式
定义
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
优点
- 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
- 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
- 可以将相关操作抽象成命令,使调用者与实现者相关分离。
缺点
- 使用命令模式会导致系统中有过多的具体命令类。因为针对一种命令实现一个命令类。
场景
认为是命令的地方都可以使用命令模式。
代码
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观察者模式