一般设计过程中我们可能把别人发起的事件一个一个执行下去,这样设计过于被动,但是通过命令模式把这个命令通过一个中间人Invoker把这些命令进行组装以后它把请求方(Invoker)和执行方(Receiver)分开了,扩展性也有很好的保障。
其实我们在代码重构过程中也可以用命令模式对一些老代码进行重写。可能我们在代码前期没有想过代码设计,可能为图方便把代码开发完成,导致后来代码越来越难以维护。
命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。
命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
以下代码都是网上拷贝。
一.概念
命令模式将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
二.UML
- Recevier(动作的接收者) ,动作具体执行者,就是干活的人。
- Command(命令对象接口),调用命令对象的execute方法,就可以让接收者进行相关的动作。
- ConcreteCommand(具体命令),将一个接收者对象绑定在一个操作命令对象上。
- Invoker(调用者),持有一个命令对象,并在某个时间点调用命令对象的excute方法,将请求付诸行动。
- Client(客户端),负责创建一个具体命令对象,并设置其接收者。
三.代码
Recevier
- package com.zzy.command;
- /**
- * 动作的接收者
- * @author eason
- *
- */
- public class Receiver {
- public void action() {
- System.out.println("Receiver action()");
- }
- }
Command
- package com.zzy.command;
- /**
- * 命令对象的抽象类
- * @author eason
- *
- */
- public abstract class Command {
- protected Receiver receiver;
- public Command(Receiver receiver) {
- this.receiver = receiver;
- }
- public abstract void execute();
- }
ConcreteCommand
- package com.zzy.command;
- /**
- * 命令对象具体类
- * 将一个接收者Receiver绑定在一个操作ConcreteCommand上
- * @author eason
- *
- */
- public class ConcreteCommand extends Command {
- public ConcreteCommand(Receiver receiver) {
- super(receiver);
- }
- @Override
- public void execute() {
- receiver.action();
- }
- }
Invoker
- package com.zzy.command;
- /**
- * 调用者
- * @author eason
- *
- */
- public class Invoker {
- private Command command;
- public void setCommand(Command command) {
- this.command = command;
- }
- public void executeCommand() {
- command.execute();
- }
- }
TestCommand
- package com.zzy.command;
- /**
- * client
- * @author eason
- *
- */
- public class TestCommand {
- public static void main(String[] args) {
- Receiver receiver = new Receiver();
- Command command = new ConcreteCommand(receiver);
- Invoker invoker = new Invoker();
- invoker.setCommand(command);
- invoker.executeCommand();
- }
- }