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()代码输出
    打开电视 海信电视机
    关闭电视 海信电视机
    
  • 相关阅读:
    13.Convert BST to Greater Tree(将树转为更大树)
    13.调用数组顺序使奇数位于偶数前面
    12.数值的整数次方
    11.二进制中1的个数
    12.Hamming Distance(汉明距离)
    11.Find All Numbers Disappeared in an Array(找出数组中缺失的数)
    10.Find All Anagrams in a String(在一个字符串中发现所有的目标串排列)
    垃圾收集器与内存分配策略---垃圾收集器
    线程之间的协作
    1287. Mars Canals(DP)
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14126140.html
Copyright © 2011-2022 走看看