下面来自head first设计模式的命令模式一章节。
- 定义
将"请求"封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
- 类图
注:
1、Client:该类主要创建concreteCommand类,并设置其接收者Recevier;
2、Receiver:该类为接收者类,该类主要是负责接收命令,和执行命令;
3、Command:该类为 所有命令的抽象类或或接口,该类具备抽象方法execute/undo方法;
4、Invoker:该类为调用者,该调用者内部持有一个命令对象,调用者在特定时间可以调用内部方法来执行命令对象的execute/undo方;
5、ConcreteCommand:该类为Command抽象的实现,该类定义了动作与接受者之间的绑定关系
维基和书上的例子应用结合:
/** * Invoker 调用者 * @author mjs * @version 1.0.0 * @filename Switch.java * @time 2017-6-26 下午4:38:31 * @copyright(C) 2017 **********有限公司 */ package command; public class Switch { private Command command; public Switch(){ } /** * 持有命令对象初始化 * @param cmd */ public void setComman(Command cmd){ this.command = cmd; } /** * 执行命令 */ public void execute(){ command.execute(); } }
/** * 所有命令的抽象接口 * @author mjs * @version 1.0.0 * @filename Command.java * @time 2017-6-16 下午4:51:30 * @copyright(C) 2017 **********有限公司 */ package command; public interface Command { void execute(); }
/** * 开灯命令 * @author mjs * @version 1.0.0 * @filename FlipUpCommand.java * @time 2017-6-26 下午4:45:45 * @copyright(C) 2017 **********有限公司 */ package command; public class FlipUpCommand implements Command { private Light light; public FlipUpCommand(Light light){ this.light = light; } public void execute() { light.turnOn(); } }
/** * 关灯命令 * @author mjs * @version 1.0.0 * @filename FlipDownCommand.java * @time 2017-6-26 下午5:12:28 * @copyright(C) 2017 **********有限公司 */ package command; public class FlipDownCommand implements Command { private Light light; public FlipDownCommand(Light light){ this.light = light; } public void execute() { light.turnOff(); } }
/** * Receiver 灯(命令的接收者) * @author mjs * @version 1.0.0 * @filename Light.java * @time 2017-6-26 下午4:47:00 * @copyright(C) 2017 **********有限公司 */ package command; public class Light { public Light() { } /** * 开灯 */ public void turnOn(){ System.out.println("The light is on"); } /** * 关灯 */ public void turnOff(){ System.out.println("The light is off"); } }
/** * TODO * @author mjs * @version 1.0.0 * @filename Client.java * @time 2017-6-26 下午5:18:47 * @copyright(C) 2017 **********有限公司 */ package command; public class Client { public static void main(String[] args) { //创建concreteCommand类,并设置其接收者Recevier Command switchUp = new FlipUpCommand(new Light()); //创建调用者Invoker Switch lightSwitch = new Switch(); lightSwitch.setComman(switchUp); //执行命令对象动作 lightSwitch.execute(); /** * 输出: * The light is on */ } }
例子比较简单,调用者方可以使用list数组形式存储多个命令,客户端利用控制台输入来执行更多操作。
上面内容主要来自head first设计模式书中。