原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。
命令模式是将“行为请求者"和"行为实现者"解耦开来。类似于我们通过开关控制家用电器。
举个例子
我们通过遥控器开关控制空调的开关,具体空调是如何关闭的和打开的我们是不清楚也不关心的,我们只需要把空调开关的命令,通过空调遥控器发送出去就可以了。
看一下UML
图:
来看一下代码是如何实现的
先来定义一个抽象的Command
类
public abstract class AirConditionCommand {
abstract void execute();
}
定义一个空调类,也就是命令的最终接收者,具体的命令接收者,实现各种具体命令。
//命令的接收者
public class AirCondition {
public void on(){
System.out.println("AirCondition is On");
}
public void off(){
System.out.println("AirCondition is Off ");
}
}
打开空调的命令类,继承自抽象的Command
类
public class AirConditionOnCommand extends AirConditionCommand {
//关联具体命令接收者
AirCondition airCondition;
public AirConditionOnCommand(AirCondition airCondition) {
this.airCondition = airCondition;
}
@Override
void execute() {
airCondition.on();
}
}
定义空调遥控器,直接使用空调打开命令
public class AirConditionControl {
AirConditionCommand airConditionCommand;
public void setAirConditionCommand(AirConditionCommand airConditionCommand) {
this.airConditionCommand = airConditionCommand;
}
public void buttonOn(){
//直接调用空调打开命令
airConditionCommand.execute();
}
}
客户端这样使用
public class CommandDemo {
public static void main(String[] args){
//invoker 命令调用者
AirConditionControl conditionControl = new AirConditionControl();
//请求的接收者
AirCondition airCondition = new AirCondition();
//创建一个命令,并把命令接收者传进去
AirConditionCommand commandOn = new AirConditionOnCommand(airCondition);
//将命令传给调用者
conditionControl.setAirConditionCommand(commandOn);
//通过开关打开空调
conditionControl.buttonOn();
}
}
总结
命令模式是行为模式之一,是使用频率比较高的一种模式,命令模式的关键就是把请求操作的对象和具体执行这个操作的对象分离开来,就像开关和空调一样。