JAVA 设计模式之命令模式

来源:互联网 发布:淘宝对新店有什么扶持 编辑:程序博客网 时间:2024/05/21 06:19
    在许多设计中,经常设计一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。
    命令模式的包括的四种角色
        接收者(Receiver): 接收者是一个类的实例,该实例负责执行与请求相关的操作
        命令(Command)接口:命令是一个接口,规定了用来封装“请求”的若干个方法,比如,excute()、undo()等方法
        具体命令(ConcreteCommand):具体命令是实现命令接口的类的实例,具体命令必须实现命令接口中的方法,比如execute()方法,使该方法封装一个“请求”
        请求者(Invoker):请求者是一个包含Command接口变量的类的实例。请求者中的Command接口的变量可以存放任何具体命令的引用。请求者负责调用具体命令,让具体命令执行那些封装了“请求”的方法,不如execute()方法。
    命令模式的核心就是使用命令对象来封装方法的调用,即将请求者的请求:“接受者调用方法”封装到命令对象的一个方法中,这样一来,当一个对象请求另一个对象调用方法来完成某项任务时,只需和命令对象打交道,即让命令对象调用封装了“请求”的那个方法即可。
    命令模式的UML类图如下:
       命令模式的XML类图
    命令撤销:命令接口中规定了用来封装“请求”的方法,比如,execute()的方法。命令接口还可以提供用来封装撤销“请求”的方法,比如undo()方法,即undo()方法的执行能撤销execute()方法的执行效果。如果execute()方法的执行效果不可撤销(比如,退出程序等),那么具体命令就不必实现undo()方法。
    宏命令:一个具体命令,只不过它包含了其他具体命令的引用。当一个宏命令执行其execute()方法时,将导致所引用的其他具体命令执行其exectue()方法。因此,执行一个宏命令相当于执行了许多具体命令。
    命令模式的优点:
  • 在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接受者(Receiver)的引用,因此彻底消除了彼此之间的耦合。
  • 原则命令模式满足”开-闭原则”。如果增加新的具体命令和该命令的接收者,不必修改调用者的代码,掉用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接收者,新增加的调用者就可以使用已有的具体命令。
  • 由于请求者的具体请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。
  • 使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应有个具体命令,因此可以按一定的顺序执行这些具体命令。
适合使用命令模式的情景
  • 程序需要在不同的时刻指定、排列和执行请求。
  • 程序需要提供撤销操作。
  • 程序需要支持宏操作。
        
                                             
0 0
原创粉丝点击