关于设计模式:设计模式命令Command模式

模式定义

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

类图

要点总结

  • Command模式的基本目标在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现伎俩是“将行为形象为对象”
  • 实现Command接口的具体命令对象ConcreteCommand有时候依据须要可能会保留一些额定的状态信息,通过应用Composite模式,能够将多个“命令”封装为一个“复合命令”MacroCommand

Go语言代码实现

工程目录

command.go

package Command

import "fmt"

type Person struct {
   name string
   cmd Command
}

type Command struct {
   person *Person
   method func()
}

func NewCommand (p *Person, method func()) Command {
   return Command{
      person: p,
      method: method,
   }
}

func (c *Command) Execute(){
   c.method()
}

func NewPerson (name string, cmd Command) Person{
   return Person{
      name: name,
      cmd:  cmd,
   }
}

func (p *Person) Buy() {
   fmt.Println(fmt.Sprintf("%s is buying ", p.name))
   p.cmd.Execute()
}

func (p *Person) Cook() {
   fmt.Println(fmt.Sprintf("%s is cooking ", p.name))
   p.cmd.Execute()
}

func (p *Person) Wash() {
   fmt.Println(fmt.Sprintf("%s is washing ", p.name))
   p.cmd.Execute()
}

func (p *Person) Listen() {
   fmt.Println(fmt.Sprintf("%s is listening ", p.name))
   p.cmd.Execute()
}

func (p *Person) Talk() {
   fmt.Println(fmt.Sprintf("%s is talking ", p.name))
   p.cmd.Execute()
}

command_test.go

package Command

import "testing"

func TestCommand_Execute(t *testing.T) {
   laowang := NewPerson("wang", NewCommand(nil, nil))
   laozhang := NewPerson("zhang", NewCommand(&laowang, laowang.Listen))
   laofeng := NewPerson("feng", NewCommand(&laozhang, laozhang.Buy))
   laoding := NewPerson("ding", NewCommand(&laofeng, laofeng.Cook))
   laoli := NewPerson("li", NewCommand(&laoding, laoding.Wash))
   laoli.Talk()
}

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

阿里云限时活动-1核2G-1M带宽-40-100G ,特惠价87.12元/年(原价1234.2元/年,可以直接买3年),速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

You may also like...

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据