[디자인 모드] 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);
}
그 중에서
MyRequest
와 MyResponse
는 사용자 정의 형식 으로 요청 과정 을 모 의 합 니 다. 물론 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
에 전달 하고 FilterChain
의 DoFilter
방법 을 호출 하 며 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
까지 실행 하 는 지, Chain
의 DoFilter
방법 은 사실상 대상 을 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 체인 에 대한 관 리 를 한 곳 에 집중 시 켜 유지 와 확장 에 편리 함 을 실현 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.