博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
职责链(Chain of Responsibility)模式
阅读量:6037 次
发布时间:2019-06-20

本文共 2611 字,大约阅读时间需要 8 分钟。

一、 职责链(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();        }    }}

 

结果截图:

类图:

关系图:

 

你可能感兴趣的文章
linux上架设l2tp+ipsec ***服务器
查看>>
curl指令的使用
查看>>
LNAMP第二版(nginx 1.2.0+apache 2.4.2+php 5.4)
查看>>
基于用户投票的排名算法(二):Reddit
查看>>
css3中变形与动画(一)
查看>>
[实战]MVC5+EF6+MySql企业网盘实战(23)——文档列表
查看>>
[译] ES2018(ES9)的新特性
查看>>
正则与sed,grep,awk三剑客
查看>>
诊断一句SQL不走索引的原因
查看>>
Linux pipe函数
查看>>
(原創) 如何設計一個數位相框? (SOC) (Quartus II) (SOPC Builder) (Nios II) (TRDB-LTM) (DE2-70)...
查看>>
/etc/profile文件内容
查看>>
一页纸IT项目管理:大道至简的实用管理沟通工具
查看>>
汽车知识:车内异味的清除方法
查看>>
IE6 7下绝对定位引发浮动元素神秘消失
查看>>
浏览器的回流和重绘及其优化方式
查看>>
2.4 salt grains与pillar jinja的模板
查看>>
VDI序曲二十 桌面虚拟化和RemoteApp集成到SharePoint 2010里
查看>>
移动互联网,入口生死战
查看>>
JAVA多线程深度解析
查看>>