Definition:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
participants
The classes and/or objects participating in this pattern are:
if the ConcreteHandler can handle the request, it does so; otherwise it forwards the request to its successor
Client (ChainApp)
initiates the request to a ConcreteHandler object on the chain
Chain of Responsibility职责链模式,其实也很简单的。就是说有一些concrete class,其中针对特定的interface or abstract class,针对特殊情况有了特别的实现。然后,在实际情况中遇到特别的对象的话再在这里找一个具体的实现对象来执行。其中多个对象组成一条链,就是所谓的职责链了。
Sample code in c#
This structural code demonstrates the Chain of Responsibility pattern in which several linked objects (the Chain) are offered the opportunity to respond to a request or hand it off to the object next in line.
// Chain of Responsibility pattern -- Structural example
using System;
namespace DoFactory.GangOfFour.Chain.Structural { // MainApp test application
class MainApp { staticvoid Main() { // Setup Chain of Responsibility Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3);
// Generate and process request int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};
foreach (int request in requests) { h1.HandleRequest(request); }
This real-world code demonstrates the Chain of Responsibility pattern in which several linked managers and executives can respond to a purchase request or hand it off to a superior. Each position has can have its own set of rules which orders they can approve.
// Chain of Responsibility pattern -- Real World example
using System;
namespace DoFactory.GangOfFour.Chain.RealWorld {
// MainApp test application
class MainApp { staticvoid Main() { // Setup Chain of Responsibility Director Larry = new Director(); VicePresident Sam = new VicePresident(); President Tammy = new President(); Larry.SetSuccessor(Sam); Sam.SetSuccessor(Tammy);
// Generate and process purchase requests Purchase p = new Purchase(2034, 350.00, "Supplies"); Larry.ProcessRequest(p);
p = new Purchase(2035, 32590.10, "Project X"); Larry.ProcessRequest(p);
p = new Purchase(2036, 122100.00, "Project Y"); Larry.ProcessRequest(p);