命令模式
一、作用
将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作command类。
Command模式可应用于
- 整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。
- 调用前后需要对调用参数进行某些处理。
- 调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。
二、类图
三、实现
(1)命令的真正实施者
public class Receiver { public void action() { System.out.println("do some work"); } }
(2)有哪些命令,指定调用实施者
public abstract class Command { protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; } public abstract void execute(); } public class ConcrectCommand extends Command { public ConcrectCommand(Receiver receiver) { super(receiver); } @Override public void execute() { receiver.action(); } }
(3)调用命令的调用者,传入命令即可
public class Invoker { private Command command; public Invoker(Command command) { this.command = command; } public void execute() { command.execute(); } }
(4)Client 客户端 测试类
public class Client { public static void main(String[] args) { Receiver receiver = new Receiver(); Command command = new ConcrectCommand(receiver); Invoker invoker = new Invoker(command); invoker.execute(); } }