命令模式:将一个请求封装成一个对象,使得你用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能
命令模式类图
命令模式五个角色
● 客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。
● 命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
● 具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
● 请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
● 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
下面实现遥控器控制电灯的开关
//命令角色
package com.wdf.command;
/*
* 命令接口
* */
public interface Command {
public void execute();
}
//接收者
package com.wdf.command;
public class Light {
public Light() {}
public void on(){System.out.println("Light is on");}
public void off(){System.out.println("Light is off");}
}
具体命令角色
package com.wdf.command;
public class LightOnCommand implements Command{
Light light;
public LightOnCommand(Light light) {
this.light=light;
}
@Override
public void execute() {
light.on();
}
}
//请求者角色
package com.wdf.command;
public class SimpleRemoteControl {
Command command;
public SimpleRemoteControl(){}
public void setCommand(Command command){
this.command=command;
}
public void buttonWasPressed(){
command.execute();
}
}
客户端角色
package com.wdf.command;
public class Test {
public static void main(String[] args) {
SimpleRemoteControl control=new SimpleRemoteControl();//创建一个调用者,可以用来发送请求
Light light=new Light();//创建一个电灯对象,也就是请求的接受者
LightOnCommand lightOnCommand=new LightOnCommand(light);//创建一个命令,然后将接受者传给它
control.setCommand(lightOnCommand);
control.buttonWasPressed();
}
}