命令模式

来源:互联网 发布:淘宝雪梨的质量 编辑:程序博客网 时间:2024/06/01 18:25

命令模式(Command),将一个请求封装为一个对象,从而使你

可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

也就是可以把命令队列统一的封装起来由特定的执行者统一执行。

新加入的具体命令类不影响其他的类,因此增加新的具体命令类很容易。

另一方面,命令模式把请求一个操作对象与怎么执行一个操作对象分隔开来了。实现了解耦合的思想。

下面看基本类图:



如上图,我们要执行的具体操作在Receiver里面,里面有两个方法,对应着Command的两个

不同的子类,但是呢,执行Receiver的方法的不是Receiver,而是通过Invoker去执行的,这就是体现了解耦合的思想。

感觉抽象程度很高的哈。

下面看具体代码:

Command类:

package com.blog.anla.Command;/** * 用来声明执行操作的接口 * @author U-ANLA * */public abstract class Command {protected Receiver receiver;public Command(Receiver receiver){this.receiver = receiver;}abstract public void execute();}


ConcreteCommandA类:

package com.blog.anla.Command;/** * 将一个接受者对象绑定与一个动作, * 调用接受者相应的操作,以实现Execute * @author U-ANLA * */public class ConcreteCommandA extends Command{public ConcreteCommandA(Receiver receiver) {super(receiver);}@Overridepublic void execute() {receiver.ActionA();}}


ConcreteCommandB类:

package com.blog.anla.Command;public class ConcreteCommandB extends Command{public ConcreteCommandB(Receiver receiver) {super(receiver);}@Overridepublic void execute() {receiver.ActionB();}}


Receiver类:

package com.blog.anla.Command;/** * 知道如何实施和执行一个请求相关的操作 * 任何类都可能作为一个接受者。 * @author U-ANLA * */public class Receiver {public void ActionA(){System.out.println("我是Action A");}public void ActionB(){System.out.println("我是Action B");}}


Invoker类:

package com.blog.anla.Command;import java.util.ArrayList;import java.util.List;/** * 就像个外包装的服务员,负责执行命令。 * @author U-ANLA * */public class Invoker {private List<Command> commands = new ArrayList<Command>();public void addCommand(Command command) {this.commands.add(command);}public void executeCommand(){for(int i = 0;i < commands.size();i++){commands.get(i).execute();}}public void cancelCommand(Command command){commands.remove(command);}}



有不对的地方还请指出哈。

赠人玫瑰手留余香(oo)