符合:单一职责原则
结构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