职责链(Chain of Responsibility)模式

1、 职责链(Chainof Responsibility)模式ide

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

2、 责任链模式的结构spa

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

抽象处理者(Handler)角色:定义出一个处理请求的接口。若是须要,接口能够定义出一个方法,以设定和返回对下家的引用。这个角色一般由一个抽象类或接口实现。对象

具体处理者(ConcreteHandler)角色:具体处理者接到请求后,能够选择将请求处理掉,或者将请求传给下家。因为具体处理者持有对下家的引用,所以,若是须要,具体处理者能够访问下家。接口

模式理解图:requests


示例源代码:string

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();
        }
    }
}

结果截图:it


类图:io


关系图:

相关文章
相关标签/搜索