命令模式(COMMAND),又称动作(Action),事务(Transaction),通过将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,实现对请求排队或记录请求日志,以及支持可撤销的操作。命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
一、使用场景
1、需要抽象出待执行的动作以参数化某对象时。这种参数化机制在过程语言中是通过回调函数表达式实现的,Command模式则是回调机制的一个面向对象的替代品。
2、在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期,你完全可以将请求的命令对象传递给另一个不同的进程并在那实现该请求。
3、支持取消操作。在Command的execute操作执行前将状态存储到一个历史列表中,通过向后和向前遍历该列表并分别调用undo和redo方法来实现数量不限的“取消”和"重做"。
4、支持修改日志,当系统崩溃时可以用于修改的重做,以便复原崩溃前状态。在Command接口中可以加入装载和存储操作,用来将系统修改持久化到日志文件。系统恢复只需从日志文件中读入修改记录,然后使用Command的execute重新执行它们即可。
5、用构建在原语操作上的高层操作构造一个系统,比如支持事务的信息系统。一个事务封装了对数据的一组变动,Command模式提供了对事务进行建模的方法。Command提供的公共的接口,可以用来以一致的方式调用所有事务。同时使用命令模式也易于添加新事务以扩展系统。
二、UML图
注: 命令模式的关键在于引入了抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联。
三、Java实现
运行结果:
四、模式优缺点
优点:
1、降低系统耦合度。Command模式将调用操作的对象与知道如何实现该操作的对象解耦。
2、增加新的Command很容易,无需改变已有的类,扩展性强。
3、可以将多个命令装配成一个复合命令(宏命令)。
4、为请求的撤销(Undo)和重做(Redo)提供了一种设计和实现方案。
缺点:
1、对于复杂的系统,可能会导致大量具体命令类的产生。
转载于:http://blog.csdn.net/qbg19881206/article/details/18503469