白话设计模式_命令模式1
??????? 先看例子:
??????? Invoker:命令的调用者,但却不直接与命令的实施者Receiver关联,而是关联一个Command引用;????? Command:(一般用接口)表示命令,给所有需要执行的实际操作一个统一的“接口”;
????? ConcreteCommand: 具体的操作命令,实现Command接口,同时关联一个Receiver,表示作用在哪个实施者上面的操作;
????? Receiver:命令的实施者,可将它的每一种操作都封装成一个独立的命令对象,比如LightOnCommand、LightOffCommand、LightXXXCommand等,它们都实现Command接口,从而有一个共同的身份Command;
????? CommandLoader: 负责组装Reveiver和ConceteCommand,实际的客户端操作Invoker对象。
????? 仔细分析命令模式,可以看出它有很多好处:
1、请求的调用者与请求的实施者解耦
????? Invoker(请求调用者)不用像以前一样知道每一Receiver(请求的实施者),假如我们要扩展Light,例如添加一个dim()方法调低亮度,RemoteControl完全不用修改,只用添加一个LightDimCommand命令,在把它动态组装到ConreteCommand中即可。
2、可实现撤销功能
????? 不使用命令模式时,light.on()就是一个原子操作,执行完了就完了,而命令模式中由于我们把这个操作封装进了一个对象中,而对象是一个实实在在的有状态的东西,我们可以把它保存起来,这样即使操作结束,由于我们之前保存了那个命令对象,我们也就知道它到底干了什么,当然也就可以撤销了。
????? 我们甚至可以多级撤销,只要将命令对象存放进一个stack栈中,之后便可以轻松取出来。
总结:
?????? 命令模式的关键点在于:共同的接口Command、用Command对象封装每一个请求。另外,对象有状态、可以保存,以至于我们可以拿这些对象做一些扩展的功能。
?