符合:单一职责原则

结构

Command:命令,接口方法ICommand.Exec(),不同类型的命令针对不同的业务有不同的实现。(看CCTV1,看湖南卫视),公共的接口方法(按),命令能持有或引用接收者,按不同的业务对接收者做不同的命令操作

Invoker:调用者,可以持有多个命令,可以对命令写日志,回放等操作。(遥控器的返回键)

Receiver:接收者,电视

好处:接受者和调用者通过命令解耦,可以对请求命令进行排队或撤销,日志等操作
接收者没有关联调用者,调用者仅仅调用命令。
代码


type Television struct {} //接收者

func(t *Television) play(what string)error{ //接收者的表现
	fmt.Println("paly "+what)
	return nil
}

type ICommand_ interface { //命令抽象类
	Play()
}

type CCTV1Btn struct { //Command 命令持有接收者
	*Television
}

func (btn *CCTV1Btn) Play(){ 
	btn.Television.play("CCTV1")
}
func NewCCTVBTN(television *Television) *CCTV1Btn{
	return &CCTV1Btn{
		television,
	}
}

type HNTVBtn struct {
	*Television
}
func (btn *HNTVBtn) Play(){ //Command
	btn.Television.play("HNTV")
}
func NewHntv(television *Television) *HNTVBtn{
	return &HNTVBtn{
		television,
	}
}
type Invoker_ struct {
	cmds []ICommand_
}

func (this *Invoker_)Replay(){
	for i:= len(this.cmds)-1;i>=0;i--{
		this.cmds[i].Play()
	}
}

func (this *Invoker_)AddCommand(args ...ICommand_){
	this.cmds= append(this.cmds, args...)
}

main中让invoker执行命令:

	tv:=&parttenPractice.Television{}
	cmd1:=parttenPractice.NewCCTVBTN(tv)
	cmd2:=parttenPractice.NewHntv(tv)
	invoker:=parttenPractice.Invoker_{}
	invoker.AddCommand(cmd1,cmd2)
	//invoker.Play()
	invoker.Replay()

用户类需要将receiver和command 做一个匹配的进行,然后将多个command扔给invoker