- 命令模式
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。命令模式通过这种封装的方式实现将客户端和接收端解耦。
- 类型
行为型模式
- 命令模式的角色
抽象命令接口Command:定义命令的接口,声明执行的方法。
具体的命令对象ConcreteCommand:持有具体的接受者对象,完成具体的具体的命令。
接受者对象Receiver:接受者对象,真正执行命令的对象。
传递命令对象Invoker:持有命令对象,要求命令对象执行请求。
客户端对象Client:创建具体命令的对象并且设置命令对象的接受者。
- 关系图
例子:呼叫小爱同学帮你开灯..................
代码
抽象命令接口Command:
package com.command;
/**
* 抽象的命令接口,定义具体命名的接口
*/
public interface Command {
/**
*执行命名的接口
*/
void execute();
}
具体的命令对象ConcreteCommand:(开灯命令,关灯命令)
package com.command;
/**
* @Author zhaoxin
* @Email [email protected]
* @Description //TODO
* @Date 2019/4/8
**/
public class LightOnCommand implements Command {
private Light light;
/**
* 创建开灯命令的时候,传入具体的灯对象,由灯对象操作自己
* @param light
*/
public LightOnCommand(Light light){
this.light=light;
}
@Override
/**
* 具体的灯对象调用自己的开灯方法
*/
public void execute() {
light.lightOn();
}
}
package com.command;
/**
* @Author zhaoxin
* @Email [email protected]
* @Description //TODO
* @Date 2019/4/8
**/
public class LightOffCommand implements Command{
private Light light;
/**
* 创建开灯命令的时候,传入具体的灯对象,由灯对象操作自己
* @param light
*/
public LightOffCommand(Light light){
this.light=light;
}
@Override
/**
* 具体的灯对象调用自己的关灯方法
*/
public void execute() {
light.lightOff();
}
}
传递命令对象Invoker:
package com.command;
/**
* @Author zhaoxin
* @Email [email protected]
* @Description //TODO
* @Date 2019/4/8
**/
public class XiaoAi {
private Command command;
/**
* 设置具体命令
* @param command
*/
public void setCommand(Command command) {
this.command = command;
}
/**
* 执行命令
*/
public void doCommand(){
command.execute();
}
}
接受者对象Receiver:
package com.command;
/**
* @Author zhaoxin
* @Email [email protected]
* @Description //TODO
* @Date 2019/4/8
**/
public class Light {
/**
* 开灯方法
*/
public void lightOn(){
System.out.println("灯已打开");
}
/**
* 关灯方法
*/
public void lightOff(){
System.out.println("灯已关闭");
}
}
客户端对象:
package com.command;
/**
* @Author zhaoxin
* @Email [email protected]
* @Description //TODO
* @Date 2019/4/8
**/
public class Client {
public static void main(String[] args) {
//创建传递着
XiaoAi xiaoAi=new XiaoAi();
//创建命令执行者
Light light=new Light();
//创建开灯命令
LightOnCommand lightOnCommand=new LightOnCommand(light);
System.out.println("小艾,帮我开灯");
xiaoAi.setCommand(lightOnCommand);
xiaoAi.doCommand();
System.out.println("--------------------------------------------");
System.out.println("小艾,帮我关灯");
LightOffCommand lightOffCommand=new LightOffCommand(light);
xiaoAi.setCommand(lightOffCommand);
xiaoAi.doCommand();
}
}