Verantwortungskettenmuster: Ermöglicht mehreren Objekten die Möglichkeit, Anfragen zu bearbeiten, wodurch die Kopplungsbeziehung zwischen dem Absender und dem Empfänger der Anfrage vermieden wird. Diese Objekte werden zu einer Kette verbunden und die Anforderung wird entlang der Kette weitergeleitet, bis sie von einem Objekt verarbeitet wird.
Die Idee ist sehr einfach, beispielsweise den Wunsch der Mitarbeiter nach einer Gehaltserhöhung zu berücksichtigen. Es gibt drei Führungsebenen im Unternehmen: Geschäftsführer, Direktor und Manager. Wenn ein Mitarbeiter eine Gehaltserhöhung verlangt, sollte er sich an den zuständigen Manager wenden. Wenn die Höhe der Gehaltserhöhung in der Zuständigkeit des Managers liegt Genehmigen Sie ihn direkt, andernfalls wird der Antrag dem Direktor vorgelegt. Das Gleiche gilt für den Direktor, der General Manager kann alle Anfragen bearbeiten. Dies ist ein typisches Chain-of-Responsibility-Modell. Die Verarbeitung von Anfragen bildet eine Kette, bis ein Objekt die Anfrage bearbeitet. Für dieses Beispiel wird ein UML-Diagramm angegeben.
UML-Strukturdiagramm:
Ein Beispiel für ein Chain-of-Responsibility-Modell
*Dieses Beispiel zeigt die Situation von drei Arten von Verkäufern, die Bestellungen bearbeiten
*Wenn die Bestellmenge weniger als 1000 beträgt, kann der Verkäufer der ersten Ebene die Bestellung bearbeiten
* Wenn die Bestellmenge weniger als 10000 beträgt, kann der Verkäufer der zweiten Ebene die Bestellung bearbeiten
* Wenn die Wenn die Bestellmenge weniger als 100.000 beträgt, kann der Verkäufer der dritten Ebene die Bestellung bearbeiten.
using System; /**//// <summary> ///售货员接口,所有类型的售货员必须实现该接口 /// </summary> interface ISalesMan { string Name {set;get;} //售货员名字 void SetNext(ISalesMan nextSalesMan); //设置下一级售货员 void Process(Order order); //处理订单 } /**//// <summary> /// 订单类 /// </summary> class Order { private int orderAmount; public int Amount { set{ this.orderAmount = value;} get{ return this.orderAmount; } } } /**//// <summary> /// 一类售货员 /// </summary> class FirstSalesMan : ISalesMan { private ISalesMan nextSalesMan = null; private string name = string.Empty; ISalesMan 成员ISalesMan 成员 } /**//// <summary> /// 二类售货员 /// </summary> class SecondSalesMan : ISalesMan { private ISalesMan nextSalesMan = null; private string name = string.Empty; ISalesMan 成员ISalesMan 成员 } /**//// <summary> /// 三类售货员 /// </summary> class ThirdSalesMan : ISalesMan { private ISalesMan nextSalesMan = null; private string name = string.Empty; ISalesMan 成员ISalesMan 成员 } class Client { public static void Main(string[] args) { FirstSalesMan first = new FirstSalesMan(); first.Name = "firstMan"; SecondSalesMan second = new SecondSalesMan(); second.Name = "secondMan"; ThirdSalesMan third = new ThirdSalesMan(); third.Name = "thirdMan"; first.SetNext(second); second.SetNext(third); Order o = new Order(); o.Amount = 300; first.Process(o); o = new Order(); o.Amount = 1300; first.Process(o); o = new Order(); o.Amount = 11300; first.Process(o); Console.Read(); } }
Anwendbare Szenarien des Verantwortungskettenmodells
Es gibt mehrere Objekte, die eine Anfrage bearbeiten können , und welches Objekt die Anfrage bearbeitet, wird zur Laufzeit automatisch bestimmt.
Sie möchten eine Anfrage an eines von mehreren Objekten senden, ohne den Empfänger explizit anzugeben.
Die Sammlung von Objekten, die eine Anfrage verarbeiten können, sollte dynamisch angegeben werden.
Ausführlichere Erläuterungen zur Anwendung des Chain-of-Responsibility-Musters in der C++-Entwurfsmusterprogrammierung finden Sie auf der chinesischen PHP-Website!