디자인 패턴 노트 24 - 책임 체인 모델(responsibilitychain)

학교 OA 시스템의 구매 승인 항목: 요구 사항은

1) 구매자는 교구 구입

2) 금액이 5000 이하일 경우 교감 승인(0<=x<=5000)

3) 금액이 10000 이하일 경우 학장 승인(5000<x<=10000)

4) 금액이 30000 이하일 경우 교감선생님 승인(10000<x<=30000)

5) 금액이 30,000 이상인 경우 교장의 승인을 받아야 함( 30,000<x)

구매승인 프로젝트를 완성할 수 있는 프로그램을 설계해주세요.

 

 

전통, 분기 심판

OA 시스템 승인 문제에 대한 기존 솔루션 분석

1) 기존 방식은 구매요청 접수 후 해당 승인자(승인자)를 호출하여 구매금액에 따라 승인을 완료하는 방식입니다.

2) 전통적인 방식의 문제 분석: 클라이언트는 분기 판단(예: 스위치)을 사용하여 다른 조달 요청을 처리하므로 다음과 같은 문제가 있습니다. (2) 클라이언트는 승인 수준과 액세스 권한이 몇 개인지 명확하게 알아야 합니다.

3) 이와 같이 조달 요청 처리와 승인자(approver) 사이에 강력한 결합 관계가 존재하여 코드 확장 및 유지 관리에 도움이 되지 않습니다.

4) 솔루션 = "책임 사슬 모드

책임 사슬 모델에 대한 기본 소개

1) 책임 사슬 패턴이라고도 하는 책임 사슬 패턴(Chain of Responsibility Pattern)은 요청에 대한 수신자 개체 사슬을 생성합니다(단순 다이어그램). 이 패턴은 요청의 발신자와 수신자를 분리합니다.

2) 책임 사슬 패턴은 일반적으로 각 수신자가 다른 수신자에 대한 참조를 포함하도록 합니다. 객체가 요청을 처리할 수 없으면 동일한 요청을 다음 수신자에게 전달하는 식입니다.

3) 이러한 유형의 디자인 패턴은 행동 패턴입니다.

책임 사슬 패턴의 원칙 클래스 다이어그램

책임 체인 모드(Chain Of Responsibility)를 사용하면 여러 개체가 요청을 처리할 기회를 가질 수 있으므로 요청 발신자와 수신자 간의 결합 관계를 피할 수 있습니다. 이 개체를 체인에 연결하고 개체가 처리할 때까지 체인을 따라 요청을 전달합니다.

 

기본 클래스 다이어그램에 대한 설명 - 즉 (책임 체인 모델의 역할 및 책임)

1) 핸들러: 요청을 처리하기 위한 인터페이스를 정의하는 추상 핸들러로 또 다른 핸들러를 의미하기도 함

2) ConcreteHandlerA, B는 자신이 담당하는 요청을 처리하는 특정 처리기이며, 현재 요청을 처리할 수 있는 경우 후속 처리기(예: 다음 처리기)에 액세스할 수 있습니다. 그렇지 않으면 요청을 넘겨줍니다. 처리할 후계자에게 전달하여 책임 사슬을 형성합니다.

3) 요청 , 요청을 나타내는 많은 속성을 의미

 

핵심 코드:

기본 메서드에서 승인 개체는 다음 승인 개체를 설정
합니다
        .

DepartmentApprover.processRequest(purchaseRequest);

처리될 때마다 실제로 한 번만 판단되며 이 클래스의 책임 범위 내에서 처리될 수 있으며 그렇지 않으면 다음 클래스에서 처리됩니다.
    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {         // TODO 자동 생성 메서드 스텁         if(purchaseRequest.getPrice() <= 5000) {             System.out.println("요청 번호 id=" + purchaseRequest.getId() + " " + this.name + "")에 의해 처리됨;         }else {             승인자.processRequest(purchaseRequest);         }     }






 

책임 사슬 패턴에서 해야 할 일과 하지 말아야 할 일

1) 디커플링 달성 및 시스템 유연성 향상을 위한 별도의 요청 및 처리

2) 객체가 단순화되어 객체가 체인의 구조를 알 필요가 없습니다.

3) 특히 체인이 상대적으로 긴 경우 성능에 영향을 미치므로 일반적으로 Handler에서 최대 노드 수를 설정하고 임계값을 초과했는지 여부를 판단하여 체인의 최대 노드 수를 제어할 필요가 있습니다. setNext() 메소드에서 그런 다음 초장 체인으로 인한 의도하지 않은 시스템 성능 손상을 방지하기 위해 체인 설정이 허용되지 않습니다.

4) 디버깅이 불편하다. 유사한 재귀 방법을 사용하면 디버깅할 때 논리가 더 복잡해질 수 있습니다.

5) 최상의 애플리케이션 시나리오: 다단계 요청, 휴가/급여 인상 및 기타 승인 프로세스, Java 웹에서 Tomcat의 인코딩 처리, 인터셉터와 같이 동일한 요청을 처리할 수 있는 여러 개체가 있는 경우

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_22059611/article/details/103315388
Recomendado
Clasificación