[디자인 모드] Filter - Chain 의 응용

3923 단어
Filter - Chain 모드 안내
7 월 실습 이후 프로젝트 에서 알 리 바 바 DRUID 데이터베이스 미들웨어, Spring Framework 등 오픈 소스 구 조 를 활용 하기 때문에 일부 소스 코드 를 조금 읽 었 습 니 다. 역시 우수한 구 조 는 우수한 구조 입 니 다. 학습 과정 에서 디자인 모델 에 대한 응용 은 디자인 모델 에 대해 더욱 깊이 이해 할 수 있 을 것 입 니 다.
Druid 에 모듈 을 추가 하 는 것 은 Filter - Chain 모드 를 통 해 이 루어 지 며, 모든 모듈 은 Filter 인터페이스 에서 정 의 된 방법 을 구현 하고 초기 화 할 때 add 를 하면 데이터 의 Connection, Statement, ResultSet 등 을 처리 할 수 있다.
다음은 filter - chain 모드 의 실행 과정 을 간단 한 demo 로 보 여 줍 니 다.
필터 인터페이스 정의
public interface Filter {

void doFilter(MyRequest request,MyResponse response,FilterChain chain);

}

그 중에서 MyRequestMyResponse 는 사용자 정의 형식 으로 요청 과정 을 모 의 합 니 다. 물론 MyRequest 와 MyResponse 는 임의의 유형 으로 바 꿀 수 있 습 니 다.
public class MyRequest {

StringBuffer content;

public MyRequest() {

content = new StringBuffer("request");

}

public MyRequest(String content){

this.content = new StringBuffer(content);

}

public StringBuffer getContent() {

return content;

}

public void setContent(String content) {

this.content = new StringBuffer(content);

}

public void append(String append){

this.content.append(append);

}

}
public class MyResponse {

private StringBuffer content;

public MyResponse() {

content = new StringBuffer("response");

}

public MyResponse(String content){

this.content = new StringBuffer(content);

}

public StringBuffer getContent() {

return content;

}

public void setContent(String content) {

this.content = new StringBuffer(content);

}

public void append(String append){

this.content.append(append);

}

}

필터 인터페이스 구현
모든 구체 적 인 Filter 는 Filter 인터페이스 에서 정 의 된 doFilter 방법 을 실현 하고 방법 체 에서 처리 논 리 를 봉인 합 니 다.
첫 번 째 구체 적 인 Filter 유형 은 여기 서 처리 논 리 를 완전히 간소화 하고 구체 적 인 장면 정의 에 따라 처리 논 리 를 해 야 한다.자신의 직책 범 위 를 처리 하 는 논 리 를 실현 한 후에 대상 을 FilterChain 에 전달 하고 FilterChainDoFilter 방법 을 호출 하 며 FilterChain 을 중개 로 하여 대상 을 다음 Filter 에 전달 합 니 다. 잠시 후에 우 리 는 FilterChain 이런 유형의 실현 을 살 펴 보 겠 습 니 다.

public class FirstFilter implements Filter{

@Override

public void doFilter(MyRequest request, MyResponse response, FilterChain chain) {

request.append(" firsrt Filter || ");

chain.doFilter(request, response);

response.append(" firsrt Filter || ");

}

}

두 번 째 구체 적 인 Filter 유형:
public class SecondFilter implements Filter{

@Override

public void doFilter(MyRequest request, MyResponse response, FilterChain chain) {

request.append("second filter || ");

chain.doFilter(request, response);

response.append("second filter || ");

}

}
FilterChain 의 실현filterChain 은 하나의 List 인용 을 가지 고 하나의 pos 표지 판 표 시 를 통 해 어느 Filter 까지 실행 하 는 지, ChainDoFilter 방법 은 사실상 대상 을 Filter 에 전달 하고 표지 판 을 + 1 로 다음 집행 할 Filter 을 가리킨다.
public class FilterChain{

private List filters;

int pos = 0;

public FilterChain() {

filters = new LinkedList<>();

}

public void addFilter(Filter filter){

filters.add(filter);

}

public void doFilter(MyRequest request, MyResponse response) {

if(pos < filters.size()){

filters.get(pos++).doFilter(request, response, this);

}

}

}

두 가지 실현 방식
위 에서 말 한 실현 방식 은 Tomcat, Spring, 자바 웹 api 의 실현 방식 이다.물론 더 간단 한 실현 방식 은 모든 filter 가 다음 filter 의 인용 을 가지 고 처리 한 후에 nextFilter 를 직접 호출 하 는 방법 입 니 다. 실행 이 끝 날 때 까지.분명히 두 번 째 는 인 코딩 에 있어 서 더욱 간단 하고 이해 하기 쉽다.그런데 왜 많은 자바 프레임 워 크 는 첫 번 째 디자인 을 사용 해 야 합 니까?개인 적 으로 첫 번 째 는 분명히 두 번 째 실현 보다 확장 가능 하 다 고 생각한다.FilterChain 은 Filter 목록 을 가지 고 있 으 며 모든 Filter 에 대한 관리 와 통 제 를 자 연 스 럽 게 가지 고 있 습 니 다.이렇게 하면 전체 filter - Chain 체인 에 대한 관 리 를 한 곳 에 집중 시 켜 유지 와 확장 에 편리 함 을 실현 합 니 다.

좋은 웹페이지 즐겨찾기