Heim  >  Artikel  >  Java  >  Romanze der drei Königreiche: Modell der Verantwortungskette

Romanze der drei Königreiche: Modell der Verantwortungskette

Java后端技术全栈
Java后端技术全栈nach vorne
2023-08-28 15:16:25932Durchsuche

Hallo zusammen, Heute werde ich mit euch 责任链模式 Designmuster teilen. Verwenden Sie geeignete Lebensgeschichten und reale Projektszenarien, um über das Entwurfsmuster zu sprechen, und fassen Sie das Entwurfsmuster schließlich in einem Satz zusammen.

Geschichte

Vor zwei Tagen habe ich die Romanze der drei Königreiche noch einmal gelesen. Ich habe gesehen, dass Guan Yu in Cao Ying und sein Herz in Han war, und ich habe gehört, dass Liu Bei in Yuan war Dann spielte ich „Crossing the Five Passes“.

Romanze der drei Königreiche: Modell der Verantwortungskette

Guan Yu passierte fünf Pässe und tötete sechs Generäle. Hauptinhalt:

  • Der erste Pass, Dongling Pass, tötete den Wachgeneral Kong Xiu.

    Der bewachende General namens Kong Xiu war ursprünglich ein Mitglied der Gelben Turbane. Nachdem er sich Cao Cao ergeben hatte, wurde ihm befohlen, den Dongling Pass mit 500 Personen zu verteidigen. Als Guan Yus Wagenkolonne den Pass passierte, verlangte Kong Xiu das Zollabfertigungsdokument und geriet mit Guan Yu zusammen. Nach nur einer Runde wurde er von Guan Yu getötet.

  • Zweiter Durchgang, Luoyang-Pass, Meng Tan und Han Fu.

    Guan Yu passierte den Dongling-Pass und als er Luoyang überqueren wollte, blockierten Han Fu und Meng Tan die Straße mit Geweihen. Zuerst forderte Meng Tan Guan Yu heraus, aber er zerstritt sich mit Guan Yu und verlor den Kampf. Meng Tan drehte sein Pferd um und rannte zurück, um Guan Gong zu locken, um ihn zu verfolgen, damit Han Fu Pfeile von hinten abschießen konnte, um Guan Gong zu fangen. Aber wer hätte gedacht, dass Guan Gongs rotes Kaninchenpferd so schnell war, dass er Meng Tan von hinten einholen und Meng Tan mit einem Schlag halbieren konnte. Han Fu geriet in Panik und schoss einen Pfeil ab, der Guan Gong in seinem linken Arm traf, ertrug die Pfeilwunde, stürmte durch das Geweih, tötete Han Fu mit einem einzigen Schlag und überquerte dann Luoyang.

  • Der dritte Pass, Bishui Pass, Bian Xi.

    Nachdem Bian Xi erfahren hatte, dass Guan Yu den Pass passierte und seine Generäle enthauptete, Kong Xiu vom Dongling Pass, Han Fu von Luoyang und Meng Tan alle getötet wurden, dachte er, dass es schwierig sei, Guan Gong zu widerstehen. Also gab er vor, Guan Gong willkommen zu heißen, und arrangierte einen Schwertkämpfer im Zhenguo-Tempel, der auf eine Gelegenheit wartete, Guan Gong zu töten. Glücklicherweise warnte ihn Pu Jing, der alte Abt des Zhenguo-Tempels, dass Guan Gong von der Verschwörung wusste, sich mit Bian Xi überwarf und Bian Xi mit einem Schwert tötete, sodass Guan Gong den Sishui-Pass passierte.

  • Die vierte Ebene, Wang Zhi.

    Dieser Wang Zhi ist ein Verwandter von Han Fu. Er war sehr wütend, als er hörte, dass Han Fu von Guan Gong getötet wurde, also wollte er Han Fu rächen. Als Guan Gong in Xingyang ankam, veranstaltete Wang Zhi auf dem Posten ein Bankett für Guan Gong und seine beiden Frauen. Aber Hu Ban wurde heimlich geschickt, um Guan Gong anzuzünden, in der Hoffnung, ihn zu verbrennen. Aber Hu Ban berichtete Guan Yu von dem Geheimnis, weil Guan Gong seinem Vater Hu Hua einen Brief überbrachte. Guan Yu und die beiden kaiserlichen Frauen konnten im Voraus aus dem Palast fliehen, aber Hu Ban gab vor, Feuer zu legen, um Wang Zhi zu verwirren. Wang Zhi fand es jedoch später heraus und tötete Hu Ban. Als er Guan Yu verfolgen wollte, wurde er von Guan Yu getötet, sodass Guan Gong an Xingyang vorbeikam.

  • Der fünfte Pass, Yellow River Ferry, Qin Qi.

    Dieser Qin Qi ist nicht nur Xiahou Duns Lieblingsgeneral, sondern auch der Neffe des alten Generals Cai Yang. Ihm wurde befohlen, die Fähre am Gelben Fluss zu bewachen und die vorbeifahrenden Schiffe zu kontrollieren. Als Guan Gong an der Fähre des Gelben Flusses ankam, suchte er nach einem Boot, um den Fluss zu überqueren, aber Qin Qi hielt ihn nicht nur davon ab, Guan Gong und andere den Fluss überqueren zu lassen, sondern äußerte auch arrogante Worte Schließlich verärgerte Guan Gong und wurde von Guan Gong enthauptet. So bestand Guan Yu die fünf Pässe.

    Diese Handlung erinnerte mich an ein Designmuster:
  • Chain of Responsibility Pattern
.

Tatsächlich gibt es in unserem Leben viele Modelle der Verantwortungskette. Zum Beispiel: Grundsätzlich verfügt jedes Unternehmen über ein eigenes OA-System, das vor allem Funktionen wie grundlegende Mitarbeiterinformationen, Urlaubsanträge, Freistellungen und Rückerstattungen bereitstellt. Wenn ich für etwas zwei Tage frei nehmen muss, melde ich mich im OA-System an und initiiere die Urlaubsgenehmigung.

Da das Unternehmen folgende Regelungen für die Dauer des Urlaubs hat:

weniger als oder gleich einem halben Tag, ist der Genehmigungslink: Projektleiter

mehr als ein halber Tag, weniger als oder gleich 1 Tag, Der Genehmigungslink: Projektleiter + technischer Direktor

mehr als 1 Tag, Genehmigungsprozess: Projektleiter + technischer Direktor + Chef

Es ist ersichtlich, dass der Genehmigungsprozess für meinen Urlaub Projektleiter + technischer Direktor + Chef ist.

Was genau ist das Designmuster der Verantwortungskette?

Was ist das Chain-of-Responsibility-Modell?

Die englische Erklärung des Chain-of-Responsibility-Modells lautet:

Vermeiden Sie es, den Absender einer Anfrage an ihren Empfänger zu koppeln, indem Sie mehr als einem Objekt die Möglichkeit geben, die Anfrage zu bearbeiten. Verketten Sie die empfangenden Objekte und leiten Sie die Anfrage entlang der Kette weiter, bis sie von einem Objekt bearbeitet wird.

Chain of Responsibility Pattern) behandelt jeden Knoten In der Kette als Objekt verarbeitet jeder Knoten unterschiedliche Anforderungen und verwaltet automatisch das nächste Knotenobjekt intern. Wenn eine Anfrage vom Kopfende der Kette ausgegeben wird, wird sie entlang des voreingestellten Pfads der Verantwortungskette an jedes Knotenobjekt weitergeleitet, bis sie von einem Objekt in der Kette verarbeitet wird, also 行为型设计模式.

Gemeinsamer Code für das Chain-of-Responsibility-Muster

Java implementiert das Chain-of-Responsibility-Designmuster wie folgt:

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();
    }
}

Laufendes Ergebnis:

HandlerC handle ...

Aus dem obigen Code können wir das UML-Diagramm zeichnen:

Romanze der drei Königreiche: Modell der Verantwortungskette


Aus dem UML-Diagramm können wir ersehen, dass es im Verantwortungskettenmodell zwei sehr wichtige Rollen gibt:

(1), abstrakte Handlerrolle (Handler)

definiert die Schnittstelle für die Verarbeitung von Anforderungen. Eine Schnittstelle kann auch eine Methode zum Festlegen und Zurückgeben eines Verweises auf das nächste Objekt bereitstellen. Diese Rolle wird normalerweise durch eine abstrakte Java-Klasse oder eine Java-Schnittstelle implementiert.

(2), spezifische Handlerrollen (HandlerA, HandlerB, HandlerC)

Nach Erhalt der Anfrage kann der spezifische Handler wählen, ob er die Anfrage verarbeiten oder an das nächste Objekt weiterleiten möchte. Da der spezifische Handler einen Verweis auf das nächste Zuhause enthält.

责任链模式的优缺点

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

生活中的案例

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

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

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

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

请假流程的代码实现

下面我们来对,前面的案例: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天,审批结果

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

整个请假流程为:

Romanze der drei Königreiche: Modell der Verantwortungskette


Ändern Sie dieses Flussdiagramm in vertikal:

Romanze der drei Königreiche: Modell der Verantwortungskette


Verwenden Sie einfach die beiden obigen Beispiele und zwei Bilder, um die Verantwortungskette zu verstehen. Ist der Modus einfacher?

Es ist sinnlos, sich selbst zu prahlen. Werfen wir einen Blick darauf, wie die Meister das Chain-of-Responsibility-Modell nutzen.

Wie die Großen es nutzen

In Frameworks wie Spring und Mybatis kommt das Chain-of-Responsibility-Modell zum Einsatz. Schauen wir uns zunächst an, wie es im Spring eingesetzt wird.

In der org.springframework.web.servlet.DispatcherServlet-Klasse im Spring MVC:

Romanze der drei Königreiche: Modell der Verantwortungskette


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系统中的请假审批流程,完美的解释了责任链设计模式。

Das obige ist der detaillierte Inhalt vonRomanze der drei Königreiche: Modell der Verantwortungskette. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Java后端技术全栈. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen