命令模式(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);
}
@Override
public void execute() {
receiver.ActionA();
}
}
ConcreteCommandB类:
package com.blog.anla.Command;
public class ConcreteCommandB extends Command{
public ConcreteCommandB(Receiver receiver) {
super(receiver);
}
@Override
public 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)