Java Design Pattern - Intercepting Filter Pattern

업데이트:

Design Pattern

  • 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다.
  • 디자인 패턴은 알고리즘이 아니라 상황에 따라 자주 쓰이는 설계 방법을 정리한 코딩 방법론일 뿐이며 모든 상황의 해결책이 아니다.

Intercepting Filter Pattern

  • 응용 프로그램의 Request나 Response의 전/후 처리를 하고자 할 때 사용된다.
  • 실제 대상 응용 프로그램에 요청을 전달하기 전에 필터가 정의되고 요청에 적용된다.
  • 필터는 인증/승인/로그인 또는 요청의 추적 작업을 수행한 다음 해당 처리기에 요청을 전달할 수 있다.

Example

public interface Filter {

  public void execute(String request);

}
public class DebugFilter implements Filter {

  public void execute(String request) {
    System.out.println("Request log: " + request);
  }

}
public class AuthenticationFilter implements Filter {

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

}
  • Filter 인터페이스를 정의하고 디버깅과 인증을 위한 DebugFilter, AuthenticationFilter 클래스를 정의한다.
public class Target {

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

}
  • Intercepting Filter Pattern의 목표가 되는 Target 클래스를 정의한다.
public class FilterChain {

  private List<Filter> filters = new ArrayList<Filter>();
  private Target target;

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

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

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

}
public class FilterManager {

  FilterChain filterChain;

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

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

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

}
  • Filter를 관리하고 전처리를 하기 위한 FilterChain 클래스를 정의한다.
  • 필터 처리를 관리하고 적절한 필터를 사용하여 올바른 순서로 FilterChain을 생성하고 처리를 시작하는 FilterManager 클래스를 정의한다.
public class Client {

  FilterManager filterManager;

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

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

}
  • FilterManager를 관리하고 적용 할 수 있는 Client 클래스를 정의한다.
public class InterceptingFilterMain {

  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");
  }

}
  • FilterManager 객체를 생성하여 Client 객체에 적용하여 요청을 수행해본다.

Source

Sample Code는 여기에서 확인 가능합니다.

댓글남기기