GoF说:"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."
其实就是定义一个基类CBase,然后声明几个类C1,C2,C3...继承该基类。再把这些类串起来。
这样可以降低requester和handler之间的耦合度。
其实就是定义一个基类CBase,然后声明几个类C1,C2,C3...继承该基类。再把这些类串起来。
这样可以降低requester和handler之间的耦合度。
- // Chain of Responsibility pattern -- Structural example
- using System;
- namespace DoFactory.GangOfFour.Chain.Structural
- {
- // MainApp test application
- class MainApp
- {
- static void 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);
- }
- // Wait for user
- Console.Read();
- }
- }
- // "Handler"
- abstract class Handler
- {
- protected Handler successor;
- public void SetSuccessor(Handler successor)
- {
- this.successor = successor;
- }
- public abstract void HandleRequest(int request);
- }
- // "ConcreteHandler1"
- class ConcreteHandler1 : Handler
- {
- public override void HandleRequest(int request)
- {
- if (request >= 0 && request < 10)
- {
- Console.WriteLine("{0} handled request {1}",
- this.GetType().Name, request);
- }
- else if (successor != null)
- {
- successor.HandleRequest(request);
- }
- }
- }
- // "ConcreteHandler2"
- class ConcreteHandler2 : Handler
- {
- public override void HandleRequest(int request)
- {
- if (request >= 10 && request < 20)
- {
- Console.WriteLine("{0} handled request {1}",
- this.GetType().Name, request);
- }
- else if (successor != null)
- {
- successor.HandleRequest(request);
- }
- }
- }
- // "ConcreteHandler3"
- class ConcreteHandler3 : Handler
- {
- public override void HandleRequest(int request)
- {
- if (request >= 20 && request < 30)
- {
- Console.WriteLine("{0} handled request {1}",
- this.GetType().Name, request);
- }
- else if (successor != null)
- {
- successor.HandleRequest(request);
- }
- }
- }
- }