kuibuzhiqianli 2013-05-26
Command pattern 命令模式定义:
Encapsulate a request as an object, thereby letting you parameterize cients with different requests, queue or log requests, and support undoable operations.
将请求封装成一个对象,从而让你使用不同的请求把客户端参数化、请求排队或者记录请求日志。还可以提供命令的撤销和恢复功能。
命令模式的通用模板:
具体执行方Receiver
public abstract class Receiver { // 抽象接受者,定义每个接受者都必须完成的业务 public abstract void doSomething(); }
Receiver 两个实现类:
public class ConcreteReceiver1 extends Receiver { @Override public void doSomething() { } }
public class ConcreteReceiver2 extends Receiver { @Override public void doSomething() { } }
然后是命令抽象类Command
public abstract class Command { // 定义一个子类的全局共享变量 protected final Receiver receiver; // 实现类必须定义一个接受者 public Command(Receiver _receiver) { this.receiver = _receiver; } // 每个命令都必须有一个执行命令的方法 public abstract void execute(); // 支持撤销请求 public abstract void rollback(); }
两个命令实现类:
public class ConcreteCommand1 extends Command { // 声明自己的默认的接受者 public ConcreteCommand1() { super(new ConcreteReceiver1()); } // 设置新的接受者 public ConcreteCommand1(Receiver _receiver) { super(_receiver); } @Override public void execute() { super.receiver.doSomething(); } @Override public void rollback() { System.out.println("根据命令日志撤销"); } }
public class ConcreteCommand12 extends Command { // 声明自己的默认的接受者 public ConcreteCommand12() { super(new ConcreteReceiver1()); } // 设置新的接受者 public ConcreteCommand12(Receiver _receiver) { super(_receiver); } @Override public void execute() { super.receiver.doSomething(); } @Override public void rollback() { System.out.println("根据命令日志撤销"); } }
最后是请求方Invoker类,跟客户端打交道的唯一的类:
public class Invoker { private Command command; // 受气包,所有命令都得接受 public void setCommand(Command _command) { this.command = _command; } // 执行命令 public void action() { this.command.execute(); } }
客户端调用演示:
public class Client { public static void main(String[] args) { // 首先声明调用者Invoker Invoker invoker = new Invoker(); // 定义一个发送给接受者的命令 Command command = new ConcreteCommand1(); // 把命令交给调用者去执行 invoker.setCommand(command); invoker.action(); } }
命令模式优点:
1,类间解耦
调用者角色和接受者角色之间没有任何依赖关系,调用者实现功能时只需要调用Command抽象类的execute方法就可以了,不需要了解到底哪个接受者执行。
2,可扩展性
Command子类可以非常容易的扩展,而调用者Invoker和高层次模块Client不产生严重的代码耦合
3,命令模式结合其他模式更优秀
命令模式可以结合责任链模式,实现命令族解析任务;
结合模板方法模式,则可以减少Command子类膨胀问题
命令模式缺点:
如果有N个命令,那么Command子类就必须有N个
本人博客已搬家,新地址为:http://yidao620c.github.io/