责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
在处理用户的请求时可能要根据不同的情况对请求添加不同的处理逻辑,在这时候就可以利用责任链进行设计。当需要添加一个处理逻辑时可以很方便的添加一个处理的节点。
现在我们的需求是处理用户的请求,将用户提交的字符串信息进行层层处理,同时在处理完成之后返回结果时,也要对返回的字符串进行层层处理,而处理返回的情况时其处理的顺序和先前是正好相反的顺序。
首先建立用户的请求和接收对象Request和Response:
- packagecom.lcq.filter;
- publicclassRequest {
- String requestStr;
- publicString getRequestStr() {
- returnrequestStr;
- }
- publicvoidsetRequestStr(String requestStr) {
- this.requestStr = requestStr;
- }
- }
- packagecom.lcq.filter;
- publicclassResponse {
- String responseStr;
- publicString getResponseStr() {
- returnresponseStr;
- }
- publicvoidsetResponseStr(String responseStr) {
- this.responseStr = responseStr;
- }
- }
|
我们将处理用户信息的逻辑抽象成为一个个的过滤器,进一步抽象出过滤器接口Filter:
- packagecom.lcq.filter;
- publicinterfaceFilter {
- publicvoiddoFilter(Request request, Response response,FilterChain chain);
- }
|
注意在Filte接口中doFilter方法参数中有FilterChain的一个变量,我们再建立FilterChain类:
- packagecom.lcq.filter;
- importjava.util.ArrayList;
- importjava.util.List;
- publicclassFilterChainimplementsFilter {
- List<Filter> filters =newArrayList<Filter>();
- intindex =0;
- publicFilterChain addFilter(Filter f) {
- this.filters.add(f);
- returnthis;
- }
- @Override
- publicvoiddoFilter(Request request, Response response, FilterChain chain) {
- if(index == filters.size())
- return;
- Filter f = filters.get(index);
- index++;
- f.doFilter(request, response, chain);
- }
- }
|