The Chain Of Responsibility (1)

오늘 은 디자인 모델 중의 책임 체인 모델 을 공유 하고 나머지 는 많은 서술 에 불과 하 다.
사고의 방향
본 격 적 으로 책임 연 대 를 접 하기 전에 우리 가 상상 할 수 있 는 것 은 체인, 링크?한 가지 일 을 처리 하려 면 사슬 이 필요 한 것 같 습 니까?사실 답 은 많 지 않다. 바로 이렇다.디자인 모델 도 모두 소박 한 사고 에서 일련의 정 리 를 통 해 얻 은 것 이다.다음은 책임 체인 의 진화 의 길 을 이야기 하 겠 습 니 다.
근원
책임 체인 도 실제 개발 에서 끊임없이 승화 되 어 얻 은 '체계' 인 데 이것 도 '모델' 이 라 고 부 르 는 원인 이다.예 를 들 어, 우 리 는 지금 사용자 가 업로드 한 데 이 터 를 필터 해 야 한다.이런 기능 을 실현 하려 면 우리 가 먼저 생각 하 는 것 은 다음 과 같다.
//            
        String message = "<script>while(1){alert('HaHa,   ,   ')</script>";

         String result = message.replaceAll("<","[");
         result = result.replaceAll(">","]");

        System.out.println("        :" + message);
        System.out.println("        :" + result);

간단 하 죠? 그런데 생각해 보 니 이 정도 면 충분 할 까요?
사실 String 류 의 디자인 은 하나의 체인 모델 이다. 이런 점 에서 우 리 는 replace All 방법 에서 실 마 리 를 볼 수 있다.
난이도 좀 높 여 주세요.
지금 만약 에 더욱 고 급 스 러 운 기능 을 추가 했다 면 그것 은 HTML 코드 에 대한 전의, 민감 한 단어의 여과, 대체 어의 교체 등 을 실현 하 는 것 이다.그러면 우리 가 이렇게 쓰 면 이 방법 체 는 크게 변 하고 유지 하기 가 쉽 지 않다.그리고 대상 을 대상 으로 하 는 사고 에 따라 우 리 는 하나의 인 터 페 이 스 를 추상 화하 고 어떤 기능 을 실현 하려 면 이 인 터 페 이 스 를 실현 하여 해당 하 는 업무 논 리 를 완성 하도록 하면 되 잖 아.
다음은 이런 실현 을 살 펴 보 자.우선 인터페이스: Filter. java
package ResponsibilityChain;

public interface Filter {

    public String doFilte(String message);

}

HTMLFilter.java
package ResponsibilityChain;


/** * HTML filter utility. * *              * * @author Craig R. McClanahan * @author Tim Tye */
public final class HTMLFilter implements Filter{

    /** * Filter the specified message string for characters that are sensitive in * HTML. This avoids potential attacks caused by including JavaScript codes * in the request URL that is often reported in error messages. * * @param message * The message string to be filtered */
    public String doFilte(String message) {

        if (message == null)
            return (null);

        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuilder result = new StringBuilder(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
            case '<':
                result.append("&lt;");
                break;
            case '>':
                result.append("&gt;");
                break;
            case '&':
                result.append("&amp;");
                break;
            case '"':
                result.append("&quot;");
                break;
            default:
                result.append(content[i]);
            }
        }
        return (result.toString());

    }

}

SesitiveFilter.java
package ResponsibilityChain;

public final class SesitiveFilter implements Filter {

    @Override
    public String doFilte(String message) {

        //            ,           ,        ,          ,        
        String str = message.replaceAll("   ", "    ");
        return str;
    }

}

ReplacableFilter.java
package ResponsibilityChain;

public class ReplacableFilter implements Filter {

    @Override
    public String doFilte(String message) {
        //            ,           ,        ,          ,        
        String str = message.replaceAll("   ", "    ");
        return str;
    }

}

그 다음 에 업무 논리 적 인 관리자 입 니 다. 여과 할 데 이 터 를 받 고 처 리 된 데 이 터 를 되 돌려 줍 니 다. MyProcessor. 자바.
package ResponsibilityChain;

public class MyProcessor {

    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String process() {
        //                
        HTMLFilter htmlFilter = new HTMLFilter();
        String result = htmlFilter.doFilte(msg);

        //         
        SesitiveFilter sesitiveFilter = new SesitiveFilter();
        result = sesitiveFilter.doFilte(result);

        ReplacableFilter replacableFilter = new ReplacableFilter();
        result = replacableFilter.doFilte(result);

        return result;
    }

}

마지막 으로 테스트 해 보 자.Main.java
package ResponsibilityChain;

public class Main {

    public static void main(String[] args) {
        //            
        String message = "<script>while(1){alert('HaHa,   ,   ')</script>";

         MyProcessor myProcessor = new MyProcessor();
         myProcessor.setMsg(message);
         String result = myProcessor.process();

        System.out.println("        :" + message);
        System.out.println("        :" + result);
    }

}

요약 하면 우리 가 필요 로 하 는 기능 을 실현 할 수 있 습 니 다. 우 리 는 MyProcessor 류 에 필 터 를 추가 하여 우리 가 필요 로 하 는 모든 기능 을 완성 할 수 있 습 니 다.하지만 보 세 요.
public String process() {
        //                
        HTMLFilter htmlFilter = new HTMLFilter();
        String result = htmlFilter.doFilte(msg);

        //         
        SesitiveFilter sesitiveFilter = new SesitiveFilter();
        result = sesitiveFilter.doFilte(result);

        ReplacableFilter replacableFilter = new ReplacableFilter();
        result = replacableFilter.doFilte(result);

        return result;
    }

이 코드 는 항상 좀 지루 하고 느낌 이 좀 무겁다.다음은 우리 가 이 문 제 를 해결 하 겠 습 니 다.
책임 체인 전신
위의 코드 가 너무 번 거 로 운 것 을 해결 하기 위해 책임 체인 의 전신 을 도입 하 였 습 니 다. 그것 은 하나의 배열 로 우리 의 모든 Filter 의 실현 류 를 저장 하여 우리 의 여과 임 무 를 관리 하 는 것 입 니 다.우 리 는 MyProcessor 류 에서 만 수정 하면 된다.MyProcessor 2. java
package ResponsibilityChain;

public class MyProcessor2 {

    Filter[] filters = { new HTMLFilter(), new SesitiveFilter(), new ReplacableFilter() };

    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String process() {
        String result = msg;

        for (Filter f : filters) {
            result = f.doFilte(result);
        }

        return result;
    }

}

테스트 해 보기:
package ResponsibilityChain;

public class Main2 {

    public static void main(String[] args) {
        //            
        String message = "<script>while(1){alert('HaHa,   ,   ')</script>";

        MyProcessor2 myProcessor2 = new MyProcessor2();
        myProcessor2.setMsg(message);
        String result = myProcessor2.process();

        System.out.println("        :" + message);
        System.out.println("        :" + result);
    }

}

요약: 여기 서 우 리 는 배열 을 사용 하여 관리 하 는 장점 을 뚜렷하게 볼 수 있 습 니 다. 우 리 는 새로운 필 터 를 추가 하여 클래스 를 실현 할 때 이 배열 에 있 으 면 됩 니 다.이렇게 보니까 좀 재 미 있 겠 다.
책임 체인 출산
위의 코드 를 다 보 았 으 니 틀림없이 이 업무 논리 에 대해 잘 알 고 있 을 것 이다.그러나 이것 은 우리 의 책임 체인 모델 이 아니 라 '체인' 의 특징 을 나타 내지 못 했다. 그리고 만약 에 우리 가 두 개의 이런 배열 이 있다 면 합작 하여 여과 임 무 를 완성 해 야 하고 한 사람 이 반 을 완성 할 때 다른 배열 의 임 무 를 삽입 해 야 한다 면 비교적 까다 로 울 것 이다.그래서 다음은 책임 체인 에 맡 겨 관리 하 겠 습 니 다.FilterChain.java
package ResponsibilityChain;

import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter{

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

    /** * return itself for better usage the Chain * * @param f * @return */
    public FilterChain addFilter(Filter f) {
        filters.add(f);
        return this;
    }

    public void remove(Filter f) {
        filters.remove(f);
    }

    /** * For the chain , it's also a chain for filter * * @param message * message need to be filtered * @return */
    public String doFilte(String message) {
        String result = message;
        for (Filter f : filters) {
            result = f.doFilte(result);
        }
        return result;
    }

}

이렇게 되면 MyProcessor 도 MyProcessor 3. java 와 같은 수정 을 해 야 한다.
package ResponsibilityChain;

public class MyProcessor3 {

    private FilterChain filterChain;

    public FilterChain getFilterChain() {
        return filterChain;
    }

    public void setFilterChain(FilterChain filterChain) {
        this.filterChain = filterChain;
    }

    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    //      and  
    public String process() {
        String result = msg;

        result = filterChain.doFilte(result);

        return result;
    }

}

다시 한 번 테스트 해 보 겠 습 니 다. Main 3. 자바.
package ResponsibilityChain;

public class Main3 {

    public static void main(String[] args) {
        //            
        String message = "<script>while(1){alert('HaHa,   ,   ')</script>";

        MyProcessor3 myProcessor3 = new MyProcessor3();
        myProcessor3.setMsg(message);

        FilterChain filterChain = new FilterChain();
        // filterChain.addFilter(new HTMLFilter());
        // filterChain.addFilter(new SesitiveFilter());
        // filterChain.addFilter(new ReplacableFilter());

        myProcessor3.setFilterChain(filterChain);
        //                ,          
        filterChain.addFilter(new HTMLFilter()).addFilter(new SesitiveFilter()).addFilter(new ReplacableFilter());
        String result = filterChain.doFilte(message);   
        System.out.println("        :" + message);
        System.out.println("        :" + result);
    }

}

여기 서 잘 정리 해 야 합 니 다. 전형 적 인 사상 은 항상 사람 을 감탄 하 게 합 니 다.혹시 FilterChain. java 에서
public FilterChain addFilter(Filter f) {
        filters.add(f);
        return this;
    }

이 방법 은 체인 의 효 과 를 완성 할 수 있다.자신 에 게 돌아 가면 똑 같은 방법 으로 체인 식 으로 임 무 를 완성 할 수 있다.그리고 FilterChain 에 도 doFilte 방법 이 있 습 니 다. 즉, 우 리 는 필 터 를 완성 하 는 기능 을 MyProcessor. java 류 에서 FilterChain 류 로 옮 겼 습 니 다.
또한 Filter 인터페이스의 FilterChain 을 실현 하면 더욱 자유로운 여과 규칙 을 추가 할 수 있 습 니 다.
이것 이 바로 대상 을 대상 으로 하 는 핵심 이다. 한 대상 이 어떤 기능 을 완성 할 수 있 는 지 는 그 자체 의 속성 에 달 려 있다.
이렇게 하면 우 리 는 MyProcessor 3. java 에서 책임 체인 의 이 필터 기능 만 호출 하면 된다.
총결산
본 고 는 현실 적 인 문제 에서 출발 하여 간단 하고 소박 한 사상, 대상 을 대상 으로 하 는 강화 와 전형 적 인 책임 체인 사상의 견인 을 거 쳤 다.간단 한 책임 체인 모델 의 작은 예 를 완성 했다.
세 심하게 음미 해 보면 느 낀 게 많 을 거 야.책임 체인 모델 은 실제 개발 과정 에서 도 흔히 볼 수 있다. 예 를 들 어 Struts 2 의 차단기 스 택 등 이다.

좋은 웹페이지 즐겨찾기