设计模式——命令模式
从前有个佣人,天天做家务,有一天她累了。坐在地上,她想:我每天都拿着扫帚扫地,拿着抹布擦桌子,干一百件活要用一百种方式。如果能有一个万能的盒子,盒子里面可能有扫帚,可能有抹布,每当干家务时我只需要把盒子打开就能完成相应的活了。
1.情急举例
今天要做的是一个万能处理机,不管什么样的请求,什么样的工作,万能处理机都能完成。
让我们来构思一下做法。很简单啊,只需要一个处理机类就行了,然后里边有各式各样的方法,想实现哪个功能就调用哪个方法。
等等,工作是做不完的,如果有新的工作怎么办?给万能处理机增加一个新的方法吗?如果我有100亿个功能呢?
让我们用命令模式重构万能处理机。
2.使用命令模式
万能处理机每做一件工作,就相当于是执行了一条命令。现在我们输入的每一条命令都是不同格式的,万能处理机每次都要用独一无二的方法处理命令,命令执行人紧紧的耦合在了一起。
使用命令模式,把命令和执行人分离开来。
首先,我们要让所有的命令有统一的格式,这样万能处理机就不用去识别命令的格式了,它只需要用统一的操作方法去执行命令即可。
//统一的命令格式
public interface Command {
//每个具体的命令都要实现该方法
public void execute();
}
我们通过Command接口规范所有的命令格式。
现在万能处理机不会再对不同格式的命令有不同的动作了,它只接受实现Command接口的类,只操作接口。
public class Processor {
//通过多态操纵对象
public void doCommand(Command command) {
command.execute();
}
}
现在我们实现具体的命令吧。
//输入操作
public class InputCommand implements Command {
@Override
public void execute() {
System.out.println("输入操作处理完毕");
}
}
//打印操作
public class PrintCommand implements Command {
@Override
public void execute() {
System.out.println("打印操作处理完毕");
}
}
每个具体的命令都实现了Command接口,这样他们就相当于是拥有了统一的格式,处理机在处理这些请求时就不用一一分析了,只需操纵Command接口方法即可。
测试。
public class MainTest {
public static void main(String[] args) {
//定义一个命令集合
ArrayList<Command> list = new ArrayList<>(5);
//加入命令
list.add(new InputCommand());
list.add(new InputCommand());
list.add(new PrintCommand());
list.add(new InputCommand());
list.add(new PrintCommand());
//创建一个万能处理器
Processor p1 = new Processor();
for (int i = 0; i < list.size(); i++) {
//循环执行命令集
p1.doCommand(list.get((i)));
}
}
}
万能处理器成功的执行了任务。以后新任务出现了,就让他实现Command接口,规范命令的格式,这样就可以放到万能处理器中实现了。
3.命令模式小结
命令模式把请求进行封装,统一他们的“格式”。让我们可以通过参数化类型或者同一方法一视同仁的使用它。
在实际开发中,如果遇到了太多太多的特殊情况,需要我们一一给这些特殊情况编码时,就考虑一下使用命令模式。通过一个接口让这些特殊情况有一个共同的特征,以便我们能够一视同仁的使用它们。