Intercepting Filter Pattern

Intercepting Filter Pattern is used when developer wants to do some pre-processing with request or response of the application. Filters are defined and applied on the request before passing the request to actual target application. Filters can do the authentication/authorization/logging or tracking of request and then pass the requests to corresponding handlers. Following are the entities of this type of design patterns :

  • Filter – Filter which will perform certain task prior or after execution of request by request handler
  • Filter Chain – Filter Chain carries multiple filters and help to execute them in defined order on target
  • Target – Target object is the request handler
  • Filter Manager – Filter Manager manages the filters and Filter Chain
  • Client – Client is the object that sends request to the Target Object

In the example there are FilterChain, FilterManager, Target, Client as various objects representing entities. AuthenticationFilter and DebugFilter represent concrete filters. InterceptingFilterDemo will use Client to demonstrate the use of pattern.

Intercepting Filter Pattern UML Diagram

Step 1 : Create Filter interface

public interface Filter {
void execute(String request);
}

Step 2 : Create concrete filters

public class AuthenticationFilter implements Filter {
@Override
public void execute(String request) {
System.out.println("Authenticating request: " + request);
}
}

public class DebugFilter implements Filter {
@Override
public void execute(String request) {
System.out.println("request log : " + request);
}
}

Step 3 : Create Target

public class Target {
public void execute(String request) {
System.out.println("Executing request : " + request);
}
}

Step 4 : Create Filter Chain

public class FilterChain {
private List<Filter> filters = new ArrayList<>();
private Target target;

public void setTarget(Target target) {
this.target = target;
}

public void addFilter(Filter filter) {
filters.add(filter);
}

public void execute(String request) {
for (Filter filter : filters) {
filter.execute(request);
}
target.execute(request);
}
}

Step 5 : Create Filter Manager

public class FilterManager {
FilterChain filterChain;

public FilterManager(Target target) {
filterChain = new FilterChain();
filterChain.setTarget(target);
}

public void setFilter(Filter filter) {
filterChain.addFilter(filter);
}

public void filterRequest(String request) {
filterChain.execute(request);
}
}

Step 6 : Create Client

public class Client {
FilterManager filterManager;

public void setFilterManager(FilterManager filterManager) {
this.filterManager = filterManager;
}

public void sendRequest(String request) {
filterManager.filterRequest(request);
}
}

Step 7 : Use the Client to demonstrate Intercepting Filter Design Pattern

public class InterceptingFilterDemo {
public static void main(String[] args) {
FilterManager filterManager = new FilterManager(new Target());
filterManager.setFilter(new AuthenticationFilter());
filterManager.setFilter(new DebugFilter());

Client client = new Client();
client.setFilterManager(filterManager);
client.sendRequest("HOME");
}
}

The output will be :

Authenticating request: HOME
request log : HOME
Executing request : HOME

Leave a Reply

Your email address will not be published. Required fields are marked *