DesignPatternCommand命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
官方UML图
- Receiver(接收者): 接收者执行与请求相关的操作,它具体实现对请求的业务处理。
- Invoker(调用者):请求发送者,通过命令对象来执行请求。
- Command(抽象命令类):一个抽象类或接口,声明了执行请求的Execute()方法,通过这些方法可以调用请求接收者的相关操作
- ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了抽象命令类中声明的方法。在实现Execute()方法时,将调用接收者对象的相关操作(Action)
实际案例
场景模拟
电视机需要遥控器操控,把所有命令都封装在遥控器上
UML
代码实现
package my
import "fmt"
// 电视机
type Tv struct {
Name string
}
func NewTv(n string) *Tv {
return &Tv{Name: n}
}
func (t *Tv) StartTv() {
fmt.Println("打开电视", t.Name)
}
func (t *Tv) CloseTv() {
fmt.Println("关闭电视", t.Name)
}
// 抽象命令
type Command interface {
Execute()
}
// 开始命令
type StartCmd struct {
receiver *Tv
}
func NewStartCmd(t *Tv) *StartCmd {
return &StartCmd{receiver: t}
}
func (sc *StartCmd) StartTv() {
sc.receiver.StartTv()
}
func (sc *StartCmd) Execute() {
sc.StartTv()
}
// 关闭命令
type CloseCmd struct {
receiver *Tv
}
func NewCloseCmd(t *Tv) *CloseCmd {
return &CloseCmd{receiver: t}
}
func (cm *CloseCmd) CloseTv() {
cm.receiver.CloseTv()
}
func (cm *CloseCmd) Execute() {
cm.CloseTv()
}
// 遥控器模拟
type Box struct {
ButtonStart Command
ButtonClose Command
}
func NewBox(bs Command, bc Command) *Box {
return &Box{
ButtonStart: bs,
ButtonClose: bc,
}
}
func (b *Box) PressStart() {
b.ButtonStart.Execute()
}
func (b *Box) PressClose() {
b.ButtonClose.Execute()
}
func TTmain() {
tv := NewTv("海信电视机")
// 创建命令按钮
sc := NewStartCmd(tv)
cc := NewCloseCmd(tv)
// 把命令按钮装在遥控器上
box := NewBox(sc, cc)
// 模拟在遥控器上按键
box.PressStart()
box.PressClose()
}
# 测试ttmain()代码输出
打开电视 海信电视机
关闭电视 海信电视机