이 프로젝트의 소스 주소 : 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