设计模式-命令模式
将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。
我们拿最近很火的智能家居来做举例
小米的智能家居描绘的应用场景之一是智能音箱可以控制其他家用电器工作
先定义抽象的Command类
public interface Command {
void execute();
}
当前有两个家电,灯和电视
public class Light {
public void turnOnLight(){
System.out.println("灯被打开了");
}
public void turnOffLight(){
System.out.println("灯被关闭了");
}
}
public class Tv {
public void openTv(){
System.out.println("电视被打开了");
}
public void closeTv(){
System.out.println("电视被关上了");
}
}
分别实现对灯的开关请求
public class LightOnCommand implements Command{
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOnLight();
}
}
public class LightOffCommand implements Command{
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOnLight();
}
}
还有电视的开关请求
public class OpenTvCommand implements Command {
private Tv tv;
public OpenTvCommand(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.openTv();
}
}
public class CloseTvCommand implements Command {
private Tv tv;
public CloseTvCommand(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.closeTv();
}
}
作为Invoker的智能音箱
public class Speakers {
private List<Command> commands = new ArrayList<>();
public void addCommand(Command command){
commands.add(command);
}
public void cancelCommand(Command command){
commands.remove(command);
}
public void execute(){
for (Command command : commands) {
command.execute();
}
commands.clear();
}
}
使用
public class Demo {
public static void main(String[] args) {
Light light = new Light();
Tv tv = new Tv();
Speakers speakers = new Speakers();
speakers.addCommand(new OpenTvCommand(tv));
speakers.addCommand(new LightOnCommand(light));
speakers.execute();
LightOffCommand lightOffCommand = new LightOffCommand(light);
speakers.addCommand(new CloseTvCommand(tv));
speakers.addCommand(lightOffCommand);
speakers.cancelCommand(lightOffCommand);
speakers.execute();
}
}
命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开,实现了解耦。