将一个请求封装成一个对象,因此可以参数化多个客户的不同请求,将请求排队,记录请求日志,并且支持撤销操作。
抽象命令类(Command
):声明执行操作的一个接口
具体命令类(Concrete Command
):将一个接受者对象绑定于一个动作,实现Execute方法,以调用接受者的相关的操作。
客户应用程序(Client
):创建一个具体命令类的对象,并且设定它的接受者。
调用者(Invoker
):要求一个命令对象执行一个请求。
接受者(Receiver
):知道如何执行相关联的相关操作。
范例:1.餐馆顾客点菜,顾客只需要向服务员下订单点菜,不需要知道那个厨师做这个菜,顾客所要做的只是把订单交给服务员就可以了。这带来了很大的灵活性,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
2.我们设计一个Switch类(总开关),它可以开关风扇,也可以开关灯。开关类会有两个方法,一个是开,一个是关,它不用知道具体开关什么。Command模式将开关的请求变成对象传给Switch,这个请求可以存储或转交给其他对象。Command模式的关键是要具有Command接口,声明executed(执行)的操作。在这个例子中,Switch(开关)是调用者,因为它调用了execute的操作。
优势和缺陷
命令模式分离了接受请求的对象与实现处理请求工作的对象,这样,已经存在的类可以保持不变,使得增加新类的工作更简单。例如。很多软件的宏命令就提高了系统的自动化程度。
命令模式还可分离用户界面和义务对象,降低系统的耦合度。但是,命令模式最主要的缺陷就是,类的数量增加了,系统变得更加复杂,程序的调试工作也相应变得困难。
应用情景
1. 当你需要与动作有关的对象来作为参数。
2. 你需要在不同的时间创建请求,生成请求队列,执行请求。
3. 你需要支持取消、保存修改日志或处理事务(事务包括大量修改的数据)功能。
4. 你需要支持宏命令。