
下面来自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设计模式书中。