跳到主要内容

22、 Golang 设计模式:22_命令模式

1、介绍

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式(Command)是指,把请求封装成一个命令,然后执行该命令。

 

命令模式的结构

顾名思义,命令模式就是对命令的封装,首先来看一下命令模式类图中的基本结构:

Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。
Client类:最终的客户端调用类。

Invoker类:调用者,负责调用命令。
Receiver类:接收者,负责接收命令并且执行命令。
 

2、示例

示例代码:

package main

import "fmt"

type Command interface {
	Execute()
}
type MotherBoard struct{}

func (*MotherBoard) Start() {
	fmt.Println("系统启动中...")
}
func (*MotherBoard) Reboot() {
	fmt.Println("系统重启中...")
}

//====启动命令=====
type StartCommand struct {
	mb *MotherBoard
}

func (c *StartCommand) Execute() {
	c.mb.Start()
}
func NewStartCommand(mb *MotherBoard) *StartCommand {
	return &StartCommand{
		mb: mb,
	}
}

//====重启命令=====
type RebootCommand struct {
	mb *MotherBoard
}

func (c *RebootCommand) Execute() {
	c.mb.Reboot()
}
func NewRebootCommand(mb *MotherBoard) *RebootCommand {
	return &RebootCommand{
		mb: mb,
	}
}
//====按钮=====
type Box struct {
	button1 Command
	button2 Command
}

func (b *Box) PressButton1() {
	b.button1.Execute()
}
func (b *Box) PressButton2() {
	b.button2.Execute()
}
func NewBox(btn1, btn2 Command) *Box {
	return &Box{
		button1: btn1,
		button2: btn2,
	}
}
func main() {
	mb:=&MotherBoard{}
	btn1:=NewStartCommand(mb)
	btn2:=NewRebootCommand(mb)
	box := NewBox(btn1, btn2)
	box.PressButton1()
	box.PressButton2()
}

UML图: