DesignPatternCommand命令模式

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()代码输出
打开电视 海信电视机
关闭电视 海信电视机
posted @ 2020-12-12 19:40  maob  阅读(97)  评论(0编辑  收藏  举报