命令模式(Command Pattern)
命令模式本质是对命令的封装,从而把发出命令的责任和执行命令的责任分割开了,委派给不同的对象。
?
将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
?
Command模式的几个要点:
????? 1、Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”。
????? 2、实现Command接口的具体命令对象ConcreteCommand 有时候根据需要可能会保存一些额外的状态信息。
????? 3、通过使用Composite模式,可以将多个“命名”封装为一个“复合命令”MacroCommand。
?
优点:
????? 1、很容易构造一个命令队列
????? 2、记录相关的命令日志
????? 3、增加命令的状态,实现命令的撤销和重做
????? 4、允许接受请求的一方决定是否可做
????? 5、新的命令轻而易举可以加入其中
????? 6、支持宏命令
?
缺点:
????? 可能会有过多的具体命令类存在
?
命令接口:
public interface Command {public void execute();}
?
命令实现类:
/** * 不同的命令对应到不同的接收者 */public class ConcreteCommand implements Command{private Receiver receiver;public ConcreteCommand(Receiver receiver){this.receiver = receiver;}public void execute() {receiver.action();}}
?
接收者:
public class Receiver {public void action(){System.out.println("接收者处理请求!");}}
?
调用者:
/** * 可以调用任何命令 */public class Invoke {private Command command;public Invoke(Command command){this.command = command;}public void doAction(){command.execute();}}
?
测试代码:
/** * 命令和接收者可以根据需要灵活调整 */public class Test {public static void main(String[] args) {Receiver receiver = new Receiver();ConcreteCommand command = new ConcreteCommand(receiver);Invoke invoke = new Invoke(command);invoke.doAction();}}
??