golang设计模式图解——命令模式

本文介绍了GoF设计模式中的命令模式,包括其概念、接口实现(如命令接口、具体命令和接收者等)、优点与缺点,以及在GUI按钮控制和模拟CMD等场景的应用。
摘要由CSDN通过智能技术生成

设计模式

GoF提出的设计模式有23个,包括:
(1)创建型(Creational)模式:如何创建对象;
(2)结构型(Structural )模式:如何实现类或对象的组合;
(3)行为型(Behavioral)模式:类或对象怎样交互以及怎样分配职责。

在这里插入图片描述

行为型模式

命令模式

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

首先,我们定义命令接口。


// Command 是命令接口
type Command interface {
    Execute()
}

然后,我们实现具体的命令,例如开灯命令和关闭灯命令。

type LightOnCommand struct {
    Light *Light
}

func (loc *LightOnCommand) Execute() {
    loc.Light.On()
}

type LightOffCommand struct {
    Light *Light
}

func (loc *LightOffCommand) Execute() {
    loc.Light.Off()
}

在这里,我们假设Light对象已经实现了On()Off()方法。

接下来,我们实现遥控器,这个遥控器可以设置命令并执行命令。

type SimpleRemoteControl struct {
    slot Command
}

func (src *SimpleRemoteControl) SetCommand(command Command) {
    src.slot = command
}

func (src *SimpleRemoteControl) ButtonWasPressed() {
    src.slot.Execute()
}

最后,我们的客户端代码看起来像这样:

func main() {
    remoteControl := &SimpleRemoteControl{}
    light := &Light{}
    //开灯命令
    lightOnCommand := &LightOnCommand{Light: light}
    //关闭灯命令
    lightOffCommand := &LightOffCommand{Light: light}

    remoteControl.SetCommand(lightOnCommand)
    remoteControl.ButtonWasPressed()

    remoteControl.SetCommand(lightOffCommand)
    remoteControl.ButtonWasPressed()
}

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

使用场景:认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

注意事项:系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。
命令模式结构示意图:
在这里插入图片描述
主要涉及到以下几个核心角色:

  • 命令(Command):
    • 定义了执行操作的接口,通常包含一个 execute 方法,用于调用具体的操作。
  • 具体命令(ConcreteCommand):
    • 实现了命令接口,负责执行具体的操作。它通常包含了对接收者的引用,通过调用接收者的方法来完成请求的处理。
  • 接收者(Receiver):
    • 知道如何执行与请求相关的操作,实际执行命令的对象。
  • 调用者/请求者(Invoker):
    • 发送命令的对象,它包含了一个命令对象并能触发命令的执行。调用者并不直接处理请求,而是通过将请求传递给命令对象来实现。
  • 客户端(Client):
    • 创建具体命令对象并设置其接收者,将命令对象交给调用者执行。

总结

命令模式为我们提供了一种将请求或操作封装到一个对象中的方法,它使我们的代码更具有可扩展性和复用性。希望本文能够帮助你理解命令模式,并在实际开发中找到其应用场景。

参考

使用Go语言实现命令模式
菜鸟教程命令模式
《研磨设计模式》读书笔记
Easy 搞定 Golang设计模式

以下是几种常见的Golang设计模式: 1. 工厂模式(Factory Pattern):用于创建对象的模式,通过定义一个创建对象的接口来实现对象的实例化。 ```go type Shape interface { Draw() } type Circle struct{} func (c *Circle) Draw() { fmt.Println("Drawing a circle") } type Rectangle struct{} func (r *Rectangle) Draw() { fmt.Println("Drawing a rectangle") } type ShapeFactory struct{} func (sf *ShapeFactory) GetShape(shapeType string) Shape { if shapeType == "circle" { return &Circle{} } else if shapeType == "rectangle" { return &Rectangle{} } return nil } func main() { factory := &ShapeFactory{} circle := factory.GetShape("circle") circle.Draw() // 输出:Drawing a circle rectangle := factory.GetShape("rectangle") rectangle.Draw() // 输出:Drawing a rectangle } ``` 2. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。 ```go type Singleton struct{} var instance *Singleton func GetInstance() *Singleton { if instance == nil { instance = &Singleton{} } return instance } func main() { singleton1 := GetInstance() singleton2 := GetInstance() fmt.Println(singleton1 == singleton2) // 输出:true } ``` 3. 观察者模式(Observer Pattern):定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。 ```go type Subject struct { observers []Observer } func (s *Subject) Attach(observer Observer) { s.observers = append(s.observers, observer) } func (s *Subject) Notify() { for _, observer := range s.observers { observer.Update() } } type Observer interface { Update() } type ConcreteObserver struct{} func (co *ConcreteObserver) Update() { fmt.Println("Observer is updated") } func main() { subject := &Subject{} observer := &ConcreteObserver{} subject.Attach(observer) subject.Notify() // 输出:Observer is updated } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值