Define the filter and apply it to the request before passing it to the actual target application. The following are the entities of this design pattern.
过滤器(Filter) -filters perform certain tasks before or after the request handler executes the request.
过滤器链(Filter Chain) -the filter chain comes with multiple filters and executes them in the defined order on the Target.
Target -the Target object is the request handler.
过滤管理器(Filter Manager) -filter manager manages filters and filter chains.
客户端(Client) -Client is the object that sends the request to the Target object.
6.33.1. Realize ¶
We will create FilterChain 、 FilterManager 、 Target 、 Client As various objects that represent entities. AuthenticationFilter And DebugFilter Represents an entity filter.
InterceptingFilterDemo Class usage Client To demonstrate the interception filter design pattern.
6.33.2. Step 1 ¶
Create the filter interface Filter.Filter.java ¶
publicinterfaceFilter{publicvoidexecute(Stringrequest);}
6.33.3. Step 2 ¶
Create a solid filter.AuthenticationFilter.java ¶
publicclassAuthenticationFilterimplementsFilter{publicvoidexecute(Stringrequest){System.out.println("Authenticating
request:"+request);}}
DebugFilter.java ¶
publicclassDebugFilterimplementsFilter{publicvoidexecute(Stringrequest){System.out.println("request
log:"+request);}}
6.33.4. Step 3 ¶
Create a Target.Target.java ¶
publicclassTarget{publicvoidexecute(Stringrequest){System.out.println("Executing
request:"+request);}}
6.33.5. Step 4 ¶
Create a filter chain.FilterChain.java ¶
importjava.util.ArrayList;importjava.util.List;publicclassFilterChain{privateList<Filter>filters=newArrayList<Filter>();privateTargettarget;publicvoidaddFilter(Filterfilter){filters.add(filter);}publicvoidexecute(Stringrequest){for(Filterfilter:filters){filter.execute(request);}target.execute(request);}publicvoidsetTarget(Targettarget){this.target=target;}}
6.33.6. Step 5 ¶
Create a filter manager.FilterManager.java ¶
publicclassFilterManager{FilterChainfilterChain;publicFilterManager(Targettarget){filterChain=newFilterChain();filterChain.setTarget(target);}publicvoidsetFilter(Filterfilter){filterChain.addFilter(filter);}publicvoidfilterRequest(Stringrequest){filterChain.execute(request);}}
6.33.7. Step 6 ¶
Create a client Client.Client.java ¶
publicclassClient{FilterManagerfilterManager;publicvoidsetFilterManager(FilterManagerfilterManager){this.filterManager=filterManager;}publicvoidsendRequest(Stringrequest){filterManager.filterRequest(request);}}
6.33.8. Step 7 ¶
Use Client To demonstrate the interception filter design pattern.InterceptingFilterDemo.java ¶
publicclassInterceptingFilterDemo{publicstaticvoidmain(String[]args){FilterManagerfilterManager=newFilterManager(newTarget());filterManager.setFilter(newAuthenticationFilter());filterManager.setFilter(newDebugFilter());Clientclient=newClient();client.setFilterManager(filterManager);client.sendRequest("HOME");}}
6.33.9. Step 8 ¶
Execute the program and output the result:
Authenticating request: HOME
request log: HOME
Executing request: HOME