Heim >Java >javaLernprogramm >Romanze der drei Königreiche: Modell der Verantwortungskette
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.
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“.
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.
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 + ChefEs 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?
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 行为型设计模式
.
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:
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天,审批结果
请假天数太多,没有人批准该假条!
整个请假流程为:
Ändern Sie dieses Flussdiagramm in vertikal:
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.
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:
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!