ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

行为型:三. 命令模式

2022-04-13 22:32:35  阅读:183  来源: 互联网

标签:tv type 模式 命令 command func device 行为


命令模式是什么

命令模式是一种行为型设计模式,它可以将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

为什么用命令模式

在软件开发系统中,“方法的请求者”与“方法的实现者”之间经常存在紧密的耦合关系,这不利于软件功能的扩展与维护。例如,想对方法进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与实现者解耦?”变得很重要,命令模式就能很好地解决这个问题。

在现实生活中,命令模式的例子也很多。比如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。

命令模式怎么实现

这里以生活中电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)来举例。

device.go (电视设备)
package command

import "fmt"

type device interface {
    on()
    off()
}

type tv struct {
    isRunning bool
}

func (t *tv) on() {
    t.isRunning = true
    fmt.Println("Turning tv on")
}

func (t *tv) off() {
    t.isRunning = false
    fmt.Println("Turning tv off")
}
command.go 命令
package command

type command interface {
    execute()
}

type onCommand struct {
    device device
}

func (c *onCommand) execute() {
    c.device.on()
}


type offCommand struct {
    device device
}

func (c *offCommand) execute() {
    c.device.off()
}
button.go 按钮
package command

type button struct {
    command command
}

func (b *button) press() {
    b.command.execute()
}

example.go 客户端调用示例
package command

func Example() {
    tv := &tv{}

    onCommand := &onCommand{
        device: tv,
    }

    offCommand := &offCommand{
        device: tv,
    }

    onButton := &button{
        command: onCommand,
    }
    onButton.press()

    offButton := &button{
        command: offCommand,
    }
    offButton.press()
}

优点

  1. 单一职责原则。 你可以解耦触发和执行操作的类。
  2. 开闭原则。 扩展性良好,增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类。

缺点

  1. 可能产生大量具体的命令类。因为每一个具体操作都需要设计一个具体命令类,这会增加系统的复杂性。

标签:tv,type,模式,命令,command,func,device,行为
来源: https://www.cnblogs.com/ourongxin/p/16142452.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有