>  기사  >  Java  >  삼국지의 로맨스: 책임 사슬 모델

삼국지의 로맨스: 책임 사슬 모델

Java后端技术全栈
Java后端技术全栈앞으로
2023-08-28 15:16:25933검색

안녕하세요 여러분, 오늘은 디자인 패턴에 대해 责任链模式 여러분과 공유하겠습니다. 적절한 인생 이야기와 실제 프로젝트 시나리오를 사용하여 디자인 패턴에 대해 이야기하고 마지막으로 디자인 패턴을 한 문장으로 요약합니다.

Story

이틀전에 삼국지연의를 다시 읽었는데 관우가 조영에 있고 마음이 한에 있고 유비가 원에 있다는 것을 들었습니다. Shao의 장소. 그런 다음 "다섯 관을 건너기"를 플레이했습니다. 여섯 명의 장군을 죽였습니다.

삼국지의 로맨스: 책임 사슬 모델

Guan Yu는 5개의 관문을 통과하고 6명의 장군을 죽였습니다. 주요 내용:

  • 첫 번째 관문인 Dongling Pass는 경비 장군 Kong Xiu를 죽였습니다.

    동릉관 수호장 공수(孔保)는 원래 황건파의 일원이었는데, 조조에게 항복한 후 500명과 함께 동릉관을 지키라는 명령을 받았습니다. 관우의 자동차 행렬이 관우를 통과하자 공수는 통관 서류를 요구하고 관우와 충돌했다. 단 한 바퀴 만에 관우에게 살해당했다.

  • 두 번째 패스, Luoyang Pass, Meng Tan 및 Han Fu.

    관우는 동링관을 지나 낙양을 건너려고 할 때 한푸와 맹담이 뿔로 길을 막았습니다. 먼저 맹담이 관우에게 도전했으나 관우와 싸우다가 패하자 맹담은 말을 돌려 뒤로 달려가 관공을 유인해 그를 쫓아오게 하여 한복이 뒤에서 화살을 쏘아 관공을 붙잡게 했다. 그러나 관공의 붉은 토끼 말이 너무 빨라 맹담이 뒤에서 따라잡을 수 있을 것이라고 누가 생각이나 했겠는가. 한복은 당황하여 화살을 쏘아 관공의 왼팔을 때렸다. 관공은 화살의 상처를 견디고 뿔을 뚫고 달려가 한복을 일격에 죽이고 낙양을 건넜다.

  • 세 번째 고개, 비수관, 비안시.

    관우가 관우를 통과하여 장군들을 참수하고 동링관 공수, 낙양 한복, 맹담을 모두 죽였다는 사실을 알게 된 변희는 속으로 관공을 저항하기 어렵다고 생각했습니다. 그래서 그는 관공을 환영하는 척하고 정국사에 검객을 불러 관공을 죽일 기회를 기다리게 했습니다. 다행스럽게도 정국사 주지 포경이 관공이 이 음모를 알고 있다고 경고하여 변희와 결탁하고 칼로 변희를 죽였기 때문에 관공은 시수관을 지나갔다.

  • 4번째 레벨, Wang Zhi.

    이 Wang Zhi는 Han Fu의 친척입니다. 그는 Han Fu가 Guan Gong에 의해 살해되었다는 소식을 듣고 매우 화가 나서 Han Fu의 복수를 원했습니다. Guan Gong이 Xingyang에 도착했을 때 Wang Zhi는 Guan Gong과 그의 두 아내를 위해 자리에서 연회를 주최했습니다. 그러나 Hu Ban은 관공을 태워 죽이려고 비밀리에 관공에게 불을 지르도록 파견되었습니다. 그러나 관공이 아버지 호화에게 편지를 가져왔기 때문에 호반은 관우에게 그 비밀을 알렸다. 관우와 두 황녀는 미리 궁궐에서 탈출할 수 있었지만 호반은 왕즈를 혼란스럽게 하기 위해 불을 지르는 시늉을 했다. 그러나 Wang Zhi는 나중에 Hu Ban을 발견하고 죽였습니다. 그가 Guan Yu를 쫓으러 왔을 때 그는 Guan Yu에게 살해되었으므로 Guan Gong은 Xingyang을 통과했습니다.

  • 다섯 번째 고개, 황하 페리, 진치.

    이 Qin Qi는 Xiahou Dun이 가장 좋아하는 장군일 뿐만 아니라 옛 장군 Cai Yang의 조카이기도 합니다. 그는 황하 페리를 지키고 지나가는 배를 확인하라는 명령을 받았습니다. 관공이 황하 나루터에 도착했을 때 강을 건너기 위해 배를 찾고 있었지만 진기는 관공과 다른 사람들이 강을 건너는 것을 거부했을 뿐만 아니라 오만한 말을 내뱉었다. 마침내 관공을 화나게 하여 관공에게 참수당했다

이렇게 관우가 5관을 통과하고 6장군을 죽이는 과정.

이 스토리라인은 나에게 디자인 패턴인 책임 사슬 패턴을 생각나게 했습니다.

사실 우리 삶에는 책임 모델이 많이 있습니다. 예를 들어, 기본적으로 모든 회사에는 기본 직원 정보, 휴가 요청, 휴가 및 상환과 같은 기능을 주로 제공하는 자체 OA 시스템이 있습니다. 어떤 일로 인해 이틀의 휴가가 필요할 경우 OA 시스템에 로그인하여 휴가 승인을 시작합니다.

회사에서는 휴가 기간에 대해 다음과 같은 규정을 두고 있기 때문에:

반나절 이하, 승인 링크는 다음과 같습니다: 프로젝트 리더

반나절 이상, 1일 이하, 승인 링크 : 프로젝트 리더 + 기술 디렉터

1일 이상, 승인 절차 : 프로젝트 리더 + 기술 디렉터 + 상사

내 휴가에 대한 승인 프로세스는 프로젝트 리더 + 기술 이사 + 상사임을 알 수 있습니다.

책임 사슬 디자인 패턴이 정확히 무엇인가요?

책임 사슬 모델이란 무엇인가요?

책임 사슬 모델에 대한 영어 설명은 다음과 같습니다.

두 개 이상의 개체에 요청을 처리할 기회를 제공하여 요청 발신자와 수신자를 연결하는 것을 방지합니다. 수신 개체를 연결하고 개체가 처리할 때까지 체인을 따라 요청을 전달합니다.

책임 패턴 체인)은 각 노드를 처리합니다. 객체로서의 체인에서 각 노드는 서로 다른 요청을 처리하고 자동으로 다음 노드 객체를 내부적으로 유지 관리합니다. 체인의 헤드 엔드에서 요청이 발행되면 체인의 개체에 의해 처리될 때까지 책임 체인의 미리 설정된 경로를 따라 각 노드 개체로 전달됩니다. 行为型设计模式

책임 사슬 패턴의 공통 코드

Java는 다음과 같이 책임 사슬 디자인 패턴을 구현합니다.

public abstract class Handler {
        protected Handler nextHandler = null;
        public abstract void handle();
        public Handler getNextHandler() {
            return nextHandler;
        }
        public void setNextHandler(Handler nextHandler) {
            this.nextHandler = nextHandler;
        }
}

public class HandlerA extends Handler{
        @Override
        public void handle() {
            if(nextHandler == null){
                System.out.println("HandlerA handle ...");
            }else{
                nextHandler.handle();
            }
        }
}

public class HandlerB extends Handler{
        @Override
        public void handle() {
            if(nextHandler == null){
                System.out.println("HandlerB handle ...");
            }else{
                nextHandler.handle();
            }
        }
}

public class HandlerC extends Handler{
    @Override
    public void handle() {
        if(getNextHandler() == null){
            System.out.println("HandlerC handle ...");
        }else{
            getNextHandler().handle();
        }
    }
}
//测试
public class  Client{
    public static void main(String[] args) {
        Handler handlerA = new HandlerA();
        Handler handlerB = new HandlerB();
        handlerA.setNextHandler(handlerB);
        handlerA.handle();
    }
}

실행 결과:

HandlerC handle ...

위 코드에서 UML 다이어그램을 그릴 수 있습니다.

삼국지의 로맨스: 책임 사슬 모델


UML 다이어그램에서 책임 체인 모델에 두 가지 매우 중요한 역할이 있음을 알 수 있습니다.

(1), 추상 처리기 역할(Handler)

은 요청 처리를 위한 인터페이스를 정의합니다. 인터페이스는 다음 객체에 대한 참조를 설정하고 반환하는 메서드를 제공할 수도 있습니다. 이 역할은 일반적으로 Java 추상 클래스 또는 Java 인터페이스에 의해 구현됩니다.

(2), 특정 핸들러 역할(HandlerA, HandlerB, HandlerC)

요청을 받은 후 특정 핸들러는 요청을 처리할지 아니면 다음 객체로 요청을 전달할지 선택할 수 있습니다. 특정 핸들러는 다음 홈에 대한 참조를 보유하고 있기 때문입니다.

责任链模式的优缺点

  • 优点:请求和处理分开,两者解耦,提供系统的灵活性。
  • 缺点:性能能问,一个链非常长的时候,非常耗时。因为我们避免建立很长的链。

生活中的案例

在日常生活中,责任链模式是比较常见的。我们平时处理工作中的一些事务,往往是各部门协同合作来完成某一个任务的。而每个部门都有各自的职责,因此,很多时候事情完成一半,便会转交到下一个部门,直到所有部门都审批通过,事情才能完成。

责任链模式主要解耦了请求与处理,客户只需将请求发送到链上即可,不需要关心请求的具体内容和处理细节,请求会自动进行传递,直至有节点对象进行处理。

责任链模式主要适用于以下应用场景:

  • 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交请求。
  • 可动态指定一组对象处理请求。

请假流程的代码实现

下面我们来对,前面的案例:OA上请假流程做一个Java代码的实现。

抽象处理者:领导类

public abstract class Leader {
    private Leader next;
    public void setNext(Leader next) {
        this.next = next;
    }
    public Leader getNext() {
        return next;
    }
    //处理请求的方法
    public abstract void handleRequest(double LeaveDays);
}

项目负责人

public class ProjectLeader extends Leader {
    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays <= 0.5) {
            System.out.println("项目负责人批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}

技术总监

public class TechnicalDirectorLeader extends Leader {

    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays <= 1) {
            System.out.println("技术总监批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}

Boss

public class BossLeader extends Leader {
    @Override
    public void handleRequest(double LeaveDays) {
        if (LeaveDays >= 2 && LeaveDays <= 30) {
            System.out.println("Boss批准您请假" + LeaveDays + "天。");
        } else {
            if (getNext() != null) {
                getNext().handleRequest(LeaveDays);
            } else {
                System.out.println("请假天数太多,没有人批准该假条!");
            }
        }
    }
}

发起审批

public class LeaveApproval {
    public static void main(String[] args) {
        //组装责任链
        Leader projectLeader = new ProjectLeader();
        Leader technicalDirectorLeader = new TechnicalDirectorLeader();
        Leader bossLeader = new BossLeader();

        projectLeader.setNext(technicalDirectorLeader);
        technicalDirectorLeader.setNext(bossLeader);

        //请假两天,提交请假流程,开启审批环节,
        projectLeader.handleRequest(2);
    }
}

审批结果

Boss批准您请假2.0天。

如果请假天数是31天,审批结果

请假天数太多,没有人批准该假条!

整个请假流程为:

삼국지의 로맨스: 책임 사슬 모델


이 흐름도를 세로로 변경하세요.

삼국지의 로맨스: 책임 사슬 모델


이렇게 위의 두 가지 예와 두 개의 그림을 사용하여 책임 사슬을 이해하세요. 모드가 더 쉽나요?

자랑해도 소용없습니다. 마스터들이 책임 사슬 모델을 어떻게 사용하는지 살펴보겠습니다.

How the big guys use

Spring, Mybatis와 같은 프레임워크에서는 책임 사슬 모델이 Spring에서 어떻게 사용되는지 먼저 살펴보겠습니다.

Spring MVC의 org.springframework.web.servlet.DispatcherServlet 클래스에서:

삼국지의 로맨스: 책임 사슬 모델


getHandler 方法的处理使用到了责任链模式,handlerMappings是之前 Spring 容器初始化好的,通过遍历 handlerMappings查找与request匹配的 Handler, 这里返回 HandlerExecutionChain 对象。这个 HandlerExecutionChain对象到后面执行的时候再分析为什么返回的是这样一个对象。

@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
 if (this.handlerMappings != null) {
  for (HandlerMapping mapping : this.handlerMappings) {
   HandlerExecutionChain handler = mapping.getHandler(request);
   if (handler != null) {
    return handler;
   }
  }
 }
 return null;
}

以上便是责任链模式在Spring的具体使用

总结

本文通过关二爷的过五关斩六将和OA系统中的请假审批流程,完美的解释了责任链设计模式。

위 내용은 삼국지의 로맨스: 책임 사슬 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Java后端技术全栈에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제