zoukankan      html  css  js  c++  java
  • 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()代码输出
    打开电视 海信电视机
    关闭电视 海信电视机
    
  • 相关阅读:
    Codeforces466C Number of Ways
    hdu 4902 Nice boat--2014 Multi-University Training Contest 4
    怎样免费设置QQ空间背景音乐
    “小懒虫”安卓手机控制电脑关机
    js和jquery实现回到顶层
    机器学习概念
    HDU 4786(最小生成树 kruskal)
    算法----堆排序(heap sort)
    openfireserver和jdk环境删除命令
    POI操作Excel导入和导出
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14126140.html
Copyright © 2011-2022 走看看