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