命令模式:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。
角色和职责:
1.Command:
声明执行操作的接口
2.Concrete Command:
具体实现
3.Invoker:
执行者
4.Receiver:
接收者
UML图
具体代码:
/** * 接收者 */ public class Receiver { public void action(){ System.out.println("执行一个命令"); } public void unAction(){ System.out.println("撤销一个命令"); } }
/** * 命令接口 */ public interface Command { void execute();//执行 void undo();//撤回 }
/** * 具体命令 */ public class ConcreteCommand implements Command{ private Receiver receiver; public ConcreteCommand(Receiver receiver){ this.receiver = receiver; } @Override public void execute() { receiver.action(); } @Override public void undo() { receiver.unAction(); } }
/** * 调用者 */ public class Invoker { public Command command; public Command getCommand() { return command; } public void setCommand(Command command) { this.command = command; } //执行命令 public void executeAction(){ command.execute(); } //撤销命令 public void undoAction(){ command.undo(); } }
public class Main { public static void main(String[] args) { //创建命令的接收者 Receiver receiver = new Receiver(); //创建命令,设定接收者 Command command = new ConcreteCommand(receiver); //创建执行者 Invoker invoker = new Invoker(); invoker.setCommand(command);//设置对应的命令 //执行命令 invoker.executeAction(); invoker.undoAction(); } }
结果:
执行一个命令
撤销一个命令
命令模式(Command)的应用效果:
1)command模式将调用操作的对象和实现该操作的对象解耦
2)可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
3)增加新的command很容易,无需改变已有的类
命令模式(Command)的适用性
1.抽象出待执行的动作以参数化某对象。
2.在不同的时刻指定、排列和执行请求。
3.支持取消操作。
4.支持修改日志,这样当系统崩溃时,这样修改可以被重做一遍。
5.用构建在原语操作上的高层操作构造一个系统。
源码地址:https://github.com/qjm201000/design_pattern_command.git