职责链(Chain of Responsibility)模式

一、 职责链(Chainof Responsibility)模式

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

二、 责任链模式的结构

责任链模式涉及到的角色如下所示:

抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。

具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

模式理解图:


示例源代码:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Chain_of_Responsibility
{
    abstract class Handler
    {
        protected Handler successor;

        public void setSuccessor(Handler successor)
        {
            this.successor = successor;
        }
        abstract public void HandleRequest(int request);
     }

    //ConcreteHandler1
    class ConcreteHandler1 : Handler
    {
        override public void HandleRequest(int request)
        {
            if (request >= 0 && request < 10)
            {
                Console.WriteLine("{0} handled request {1}", this, request);
            }
            else
                if (successor != null) successor.HandleRequest(request);
        }
    }

    class ConcreteHandler2 : Handler
    {
        public override void HandleRequest(int request)
        {
            //throw new NotImplementedException();
            if (request >= 10 && request < 20)
                Console.WriteLine("{0} handled request {1}", this, request);
            else
                if (successor != null)
                    successor.HandleRequest(request);
        }
    }
    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            //throw new NotImplementedException();
            if (request >= 20 && request < 30)
            {
                Console.WriteLine("{0} handled request {1}", this, request);
            }
            else
                if (successor != null)
                {
                    successor.HandleRequest(request);
                }
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Handler h1 = new ConcreteHandler1();
            Handler h2 = new ConcreteHandler2();
            Handler h3 = new ConcreteHandler3();

            h1.setSuccessor(h2);
            h2.setSuccessor(h3);
            h3.setSuccessor(h1);          //像一条链路,每个对象都有对下一个对象的引用。
                                                    
            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

            foreach (int request in requests)
                h1.HandleRequest(request);

            Console.ReadKey();
        }
    }
}

 

结果截图:


类图:


关系图:




 

posted @ 2013-07-30 19:40  坚固66  阅读(161)  评论(0编辑  收藏  举报