23 디자인 패턴 19 장 : Java 책임 체인 모델
정의 : 여러 객체가 요청을 처리 할 수있는 기회를 가질 수 있도록하여 요청의 수신자와 수신자 간의 커플 링 관계를 피할 수 있습니다. 이 객체를 체인에 연결하고 객체가 처리 될 때까지 체인을 따라 요청을 전달하십시오.
유형 : 행동 패턴
클래스 다이어그램 :
먼저 코드를 살펴 보겠습니다.
public void test (int i, 요청 요청) {if (i == 1) {handler1.response (request); } else if (i == 2) {handler2.Response (요청); } else if (i == 3) {handler3.Response (요청); } else if (i == 4) {handler4.Response (요청); } else {handler5.Response (요청); }}코드의 비즈니스 로직은 다음과 같습니다.이 메소드에는 정수 I과 요청 요청이라는 두 가지 매개 변수가 있습니다. 요청을 처리하는 I의 값에 따르면, i == 1이면 handler1에 의해 처리되며 i == 2 인 경우 handler2 등으로 처리됩니다.
프로그래밍에서 이러한 종류의 비즈니스 처리 방법은 매우 일반적입니다. 요청을 처리하는 모든 클래스에는 IF ... ELSE ... 조건부 판단 진술이 요청을 처리하기 위해 책임 체인에 연결된 조건부 판단 진술을 포함합니다. 나는 모두가 종종 그것을 사용한다고 믿는다. 이 방법의 장점은 매우 직관적이고 단순하며 명확하며 유지하기가 쉽지 않지만이 방법은 다음과 같은 두통이 있습니다.
코드 부풀어 오른 코드 : 실제 응용 분야에서 판단 조건은 일반적으로 1 또는 2인지 판단하기가 그렇게 간단하지 않습니다. 복잡한 계산, 데이터베이스 쿼리 등이 필요할 수 있습니다. 여기에는 많은 추가 코드가 있습니다. 많은 판단 조건이 있다면, 이것은 ... 다른 ... 진술은 기본적으로 읽을 수 없습니다.
높은 커플 링 학위 : 프로세스 요청을 계속해서 추가하려면 판단 조건을 계속 추가해야합니다. 또한이 조건의 순서도 죽은 자에게 기록됩니다. 순서를 변경하려면이 조건 명령문 만 수정할 수 있습니다.
우리는 이미 단점을 이해 했으므로이를 해결할 수있는 방법을 찾아야합니다. 이 시나리오의 비즈니스 논리는 매우 간단합니다. 조건 1이 충족되면 handler1에 의해 처리되며 충족되지 않으면 전달됩니다. 조건 2가 충족되면 handler2에 의해 처리되며 충족되지 않으면 조건이 끝날 때까지 전달됩니다. 실제로, 개선 방법은 매우 간단하며, 이는 판단 조건의 일부를 처리 클래스에 넣는 것입니다. 이것이 책임 연결 모델의 원리입니다.
책임 모델의 구조
책임 체인 패턴의 클래스 다이어그램은 매우 간단하며 추상적으로 처리 된 클래스와 구현 클래스 세트로 구성됩니다.
초록 처리 클래스 : 초록 처리 클래스에는 주로 다음 프로세싱 클래스를 가리키는 멤버 변수 Nexthandler와 요청을 처리하는 메소드 핸드 레퍼스트가 포함됩니다. Handrequest 방법의 주요 아이디어는 처리 조건이 충족되면이 처리 클래스가 처리됩니다. 그렇지 않으면 Nexthandler에 의해 처리됩니다.
특정 처리 클래스 : 특정 처리 클래스는 주로 특정 처리 로직 및 처리를위한 적용 가능한 조건을 구현합니다.
책임 체인 모델의 일반적인 아이디어를 이해 한 후에는 코드를 볼 때 이해하기가 더 쉽습니다.
클래스 레벨 {private int level = 0; 공개 레벨 (int level) {this.level = level; }; 위의 공개 부울 (레벨 레벨) {if (this.level> = level.level) {return true; } false를 반환합니다. }} 클래스 요청 {레벨 레벨; 공개 요청 (레벨 레벨) {this.Level = 레벨; } 공개 레벨 getLevel () {반환 레벨; }} 클래스 응답 {} 초록 클래스 핸들러 {개인 핸들러 nexthandler; 공개 최종 응답 handlerequest (요청 요청) {응답 응답 = null; if (this.gethandlerlevel (). } else {if (this.nexthandler! = null) {this.nexthandler.handlerequest (요청); } else {System.out.println ( "---------"); }} 반환 응답; } public void setnexthandler (핸들러 핸들러) {this.nexthandler = handler; } 보호 된 추상 레벨 gethandlerlevel (); 공개 초록 응답 응답 (요청 요청); } Class ConcreteHandler1 확장 핸들러 {보호 레벨 gethandlerLevel () {return new Level (1); } 공개 응답 응답 (요청 요청) { System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ class ConcreteHandler2 핸들러 {return gethandlerlevel (3) {System.out.println ( "------------- System.out.println (processor 3 -----”; handler2.setnexthandler (handler3); handler1.handlerequest (새 레벨 (4));}}코드에서 레벨 클래스는 결정 조건을 시뮬레이션합니다. 요청 및 응답은 각각 요청 및 응답에 해당합니다. 초록 클래스 핸들러는 주로 조건을 판단하며 처리 수준이 여기에서 시뮬레이션됩니다. 처리 클래스의 처리 수준만이 처리 될 수있는 수준보다 높습니다. 그렇지 않으면 처리를 위해 다음 프로세서로 전달됩니다.
클라이언트 클래스에서 체인의 전면 및 후면 실행 관계를 설정하고 실행 중에 첫 번째 처리 클래스에 요청을 넘겨줍니다. 이것은 책임 체인 패턴입니다. 완료되는 함수는 이전 기사의 IF ... Else ... 진술과 동일합니다.
책임 체인 모델의 장단점
IF… 다른…와 비교하여, 책임 체인 패턴은 조건부 판단을 다양한 처리 클래스에 분배하기 때문에 더 낮은 커플 링 능력을 갖고 있으며, 이러한 처리 클래스의 우선 순위 처리 순서는 마음대로 설정할 수 있습니다. 책임 체인 모델에는 또한 IF ... ELSE ... 진술, 즉 올바른 처리 클래스를 찾기 전에 모든 판단 조건을 실행 해야하는 것과 동일합니다. 책임 체인이 비교적 길면 성능 문제가 더 심각합니다.
책임 모델에 대한 적용 가능한 시나리오
처음 예제와 마찬가지로, if… else… 진술을 사용할 때 압도적이라고 느끼면 책임 체인을 구성하고 코드가 나빠 보이면 책임 모드를 사용하여 리팩터링 할 수 있습니다.
요약
책임 체인 모델은 실제로 IF ... Else ... 문의 유연한 버전입니다. 이러한 판단 조건을 각 처리 클래스에 넣습니다. 이것의 장점은 더 유연하지만 위험을 초래한다는 것입니다. 예를 들어, 처리 클래스 전후에 처리 클래스 간의 관계를 설정할 때 처리 클래스 전후에 조건부 논리 간의 관계를 판단하고 체인에서 순환 참조를하지 않도록주의해야합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.