命令模式
2021年7月15日大约 2 分钟约 624 字
1. 概念
命令模式的主要作用就是封装命令,把发出命令的责任和执行命令的责任分开,它是一种功能的分工,不同的模块可以对同一个命令做出不同的解释。
命令模式通常包含如下几个角色:
Client
——创建一个命令,并决定接受者Command
(命令接口)——定义一个抽象方法ConcreteCommand
(具体命令)——负责调用接受者的相应操作Invoker
(请求者)——负责调用命令对象执行请求Receiver
(接受者)——负责具体实施和执行一次请求
2. 示例
// 使用Command接口,实现了让ProcessArray类和具体“处理行为”的分离
// 程序使用Command接口代表了对数组的处理行为,而Command接口也没有提供真正的处理
// 只有等到需要调用ProcessArray对象的process()方法时,才真正传入一个Command对象,才确定对数组的处理行为
interface Command {
// Command接口中的process()方法用于封装“处理行为”,这个行为具体使用时再定义
void process(int[] target);
}
class ProcessArray {
// 需要处理数组的处理类,其process()方法需要一个Command参数来决定具体的处理行为
public void process(int[] target, Command cmd) {
cmd.process(target);
}
}
class PrintCommand implements Command {
public void process(int[] target) {
for (int tmp : target) {
System.out.println("Array element: " + tmp);
}
}
}
class AddCommand implements Command {
public void process(int[] target) {
int sum = 0;
for (int tmp : target) {
sum += tmp;
}
System.out.println("Array sum is: " + sum);
}
}
// 客户端调用
class CommandTest {
public static void main(String[] args) {
ProcessArray pa = new ProcessArray();
int[] target = { 3, -4, 6, 4 };
// 第一次处理数组,具体处理行为取决于PrintCommand
pa.process(target, new PrintCommand());
System.out.println("-------------------");
// 第二次处理数组,具体处理行为取决于AddCommand
pa.process(target, new AddCommand());
}
}
Tomcat中的命令模式
在Tomcat中,Connector
就是通过命令模式调用Container
的:

Connector
作为抽象请求者,HttpConnector
作为具体请求者,HttpProcessor
作为命令,Container
作为命令的抽象接受者,ContainerBase
作为具体的接受者,客户端就是应用服务器Server
组件了。Server
首先创建命令请求者HttpConnector
对象,然后创建命令HttpProcessor
对象,再把命令对象交给命令接受者ContainerBase
容器来处理。命令最终是被Tomcat的Container
执行的,命令可以以队列的方式进来,Container
也可以以不同的方式来处理请求,如HTTP1.0和HTTP1.1的处理方式就不同。