跳至主要內容

命令模式

荒流2021年7月15日大约 2 分钟约 624 字

1. 概念

命令模式的主要作用就是封装命令,把发出命令的责任和执行命令的责任分开,它是一种功能的分工,不同的模块可以对同一个命令做出不同的解释。

命令模式通常包含如下几个角色:

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的处理方式就不同。