행동 패턴 - 책임 패턴 체인 (IX)

이 프로젝트의 소스 주소 : HTTPS : //github.com/ggb2312/JavaNotes/tree/master/design-pattern (디자인 패턴 관련 코드 및 메모)

1. 정의

요청을 수신하면,이 요청 객체의 체인을 만들

2. 적용 현장

  • 처리 중 하나 개 이상의 공동 처리는 객체 요청 복수의 필요

적용 예 : 플러그인에 인터셉터, 서블릿 필터, 두보 필터, MyBatis로 스트럿

3. 관련 디자인 패턴

책임 패턴 및 상태 모드의 체인

  • 그것이 책임 체인 또는 책임 전체 체인의 단부에 처리 될 때까지 누가 각 개체의 책임 패턴 체인 처리 객체를 지정하지 않는 것은, 일련의 순서 및 클라이언트에 의하여 체인 소자의 책임이다.
  • 국가 모델은 각 개체는 누가 다음 목표 처리 예 알 수 있도록하는 것입니다.

실시 예 4 모드

배경 :되던시기 뮤 학습 코스 라인 네트워크, 두 사람 승인을 통해 갈이, 사람의주의 사항 확인, 다른 사람이 비디오를 확인하는 것입니다, 우리는이 상황이 발생할 것이다에서 OA 시스템, 승인 학년 수준. 이것은 체인입니다.

(1) 과정 카테고리

public class Course {
    private String name;
    private String article;
    private String video;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getArticle() {
        return article;
    }

    public void setArticle(String article) {
        this.article = article;
    }

    public String getVideo() {
        return video;
    }

    public void setVideo(String video) {
        this.video = video;
    }

    @Override
    public String toString() {
        return "Course{" +
                "name='" + name + '\'' +
                ", article='" + article + '\'' +
                ", video='" + video + '\'' +
                '}';
    }
}

추상 클래스로 (2) 승인

/**
 * 批准者
 */
public abstract class Approver {
    /** 责任链的核心就是在类里面包含了一个自己同样类型的一个对象 */
    protected Approver approver;

    public void setNextApprover(Approver approver) {
        this.approver = approver;
    }

    public abstract void deploy(Course course) ;
}

(3) 승인 노트

public class ArticleApprover extends Approver{

    @Override
    public void deploy(Course course) {
        if (StringUtils.isNoneEmpty(course.getArticle())) {
            System.out.println(course.getName() + "含有手记,批准");
            if (approver != null) {
                approver.deploy(course);
            }
        } else {
            System.out.println(course.getName() + "不含有手记,不批准,流程结束");
            return;
        }
    }
}

승인자 (4) 비디오

public class VideoApprover extends Approver {
    @Override
    public void deploy(Course course) {
        if (StringUtils.isNoneEmpty(course.getVideo())) {
            System.out.println(course.getName() + "含有视频,批准");
            if (approver != null) {
                approver.deploy(course);
            }
        } else {
            System.out.println(course.getName() + "不含有视频,不批准,流程结束");
            return;
        }
    }
}

(5) 테스트

public class Test {
    public static void main(String[] args) {
        Approver articleApprover = new ArticleApprover();
        Approver videoApprover = new VideoApprover();

        Course course = new Course();
        course.setName("Java设计模式精讲");
        course.setArticle("Java设计模式精讲的手记");
        course.setVideo("Java设计模式精讲的视频");
        /** 先通过手记的审核才交给视频的审核,视频的审核过了才能进行发布上线 */
        articleApprover.setNextApprover(videoApprover);
        articleApprover.deploy(course); 
    }
}

테스트 결과 :

테스트 결과

장점과 단점

장점 :

  • 송신자와 수신자 요구 (처리 요구) 디커플링
  • 책임의 체인은 동적으로 결합 될 수있다

단점 :

  • 책임의 체인이 너무 깁니다 또는 처리 시간이 성능에 영향을 미치는, 너무 깁니다
  • 책임의 체인은 과도한있을 수 있습니다

6. -JDK1.7 소스 및 책임 패턴 프레임의 확장 체인

javax.servlet.Filter 的 doFilter, FilterChain

SpringSecurity

추천

출처www.cnblogs.com/gj-blog/p/10929600.html