拦截器模式在 Web 应用的 Fitler 中有应用,对于流式的数据流处理很有用。比如对于 Shell 命令的管道可以采用拦截器模式,提供一个命令的接口,并使用一个 Chain 来进行管理。

拦截器的基本类结构用 UML 类图的方式进行表示:

其中 Filter 提供一个统一的接口, Chain 用来管理所有的 Filter,并提供一个doNext()方法来进行下一个拦截器的执行。

下面给出一个拦截器模式的示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public abstract class Command {
    protected List<Character> options;

    protected List<String> params;

    public Command() {
        options = Lists.newArrayList();
        params = Lists.newArrayList();
    }

    public List<Character> getOptions() {
        return options;
    }

    public void setOptions(List<Character> options) {
        this.options = options;
    }

    public List<String> getParams() {
        return params;
    }

    public void setParams(List<String> params) {
        this.params = params;
    }

    public abstract String execute(CommandChain chain, String data);

}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class CommandChain {
    private List<Command> commandList;

    private int index;

    public CommandChain(List<Command> commandList) {
        this.commandList = commandList;
    }

    public String doNext(String data) {
        if (commandList.size() <= index) {
            return data;
        } else {
            return commandList.get(index++).execute(this, data);
        }
    }
}