命令模式
命令模式(Command Pattern)又称为行动模式或交易模式,它是属于对象的行为模式。命令模式把一个请求或操作封装为一个对象,以便使用不同的参数来表示不同的请求(即命名),同时命令模式也支持撤销操作。
命令模式的核心是引入了一个命令类,通过命令类来降低发送者和接受者之间的耦合,让对象之间的调用关系更加灵活,实现解耦。
命令模式的四个角色
- 命令角色(Command):这是一个抽象类或者接口,所有的命令都在这里。
- 具体命令角色(ConcreteCommand):定义一个接受者对象并与动作绑定,调用接受者的相应操作来实现
execute()
方法。 - 接受者角色(Receiver):具体实施和执行一个请求相关的操作,任何一个类都可以成为接受者,实施和执行请求的方法叫做行动方法。
- 调用者角色(Invoker):负责调用命令对象执行请求。
举一个例子
使用一个遥控器对家里的智能家居进行控制,传统的家用电器是每一个设备有一个控制器,比如电视机有电视机的遥控器,空调有空调的遥控器。这里我们使用命令模式可以只用遥控器对所有的电器都进行简单的控制。
这里我们通过定义一个遥控器(调用者)来控制电灯和电视(接受者)。
Command:命令
创建一个命令的接口,里面定义执行命令的方法和撤销命令的方法。
package cn.personalweb.command;
public interface Command {
/**
* 执行命令操作
*/
public void execute();
/**
* 撤销命令操作
*/
public void undo();
}
LightReceiver:命令的接受者
创建一个命令的接受者的类,这里创建的是电灯命令的接受者,可以理解为电灯里的命令接受器,当他接受到相应命令后就执行相关方法。里面有两个方法,一个是电灯的开按钮,一个是电灯的关按钮。
package cn.personalweb.command;
public class LightReceiver {
public void on(){
System.out.println("电灯打开了...");
}
public void off() {
System.out.println("电灯关闭了...");
}
}
ConcreteCommand:具体命令角色
创建了两个类,分别是开灯命令和关灯命令,他们都实现了Command
接口,并且聚合了LightReceiver
电灯接受者类。在LightOnCommand
和LightOffCommand
中,execute()
和undo()
方法调用了接受者LightReceiver
的方法来实现方法。
LightOnCommand:开灯命令
package cn.personalweb.command;
public class LightOnCommand implements Command{
private LightReceiver light;
public LightOnCommand(LightReceiver light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
@Override
public void undo() {
light.on();
}
}
NoCommand:空命令
空命令,里面的方法没有进行任何操作,可用于初始化操作等其他作用。
package cn.personalweb.command;
/**
* @program: DesignPattern
* @description:
* @author: lizheng
* @create: 2020-09-25 22:35
**/
public class NoCommand implements Command{
@Override
public void exe