《设计模式》——职责链模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求者的发送者和接受者之间的耦合关系,这个对象连接成一条链,并沿着这条连传递该请求,直到有一个对象处理它为止。

UML图如下

具体例子分为三步

第一步:设置一个抽象类,抽象类中有两个无返回值的方法,一个是设置继承者的方法(SetSuccessor),另外一个是抽象方法,这个抽象方法被子类重写来处理具体的请求。

第二步:设置三个具体的继承者子类,自己继承抽象类,三个子类分别是ConcreteHandler1、ConcreteHandler2、ConcreteHandler3,他们分别处理整形数据1,2,11,12,21,22。ConcreteHandler1处理大于0小于10的数,ConcreteHandler2处理大于10,小于20的数,ConcreteHandler3处理大于20的数。

第三步:编写客户端(Client)代码,在客户端中分别实例化三个继承者类的对象,用一个整形数组requsets存放上面的数字,再用一个foreach循环遍历这个数组的时候处理请求。

源码奉献

抽象类Handler的代码

<span style="font-family:KaiTi_GB2312;font-size:18px;"> abstract class Handler
    {
        protected Handler successor;
        public void SetSuccessor(Handler successor1)  //设置继承者
        {
            this.successor = successor1;
        }
        public abstract void HandeleRequest(int request);//定义抽象方法,让子根据具体的实际情况重写。
    }</span>

具体类ConcreteHandler1的代码

<span style="font-family:KaiTi_GB2312;font-size:18px;"> class ConcreteHandler1 :Handler
    {
        public override void HandeleRequest(int request)
        {
            if (request >= 0 && request < 10)
            {
                Console.WriteLine("{0} 处理请求{1}",this .GetType ().Name ,request );
            }
            else if(successor !=null)
            {
                successor.HandeleRequest(request);
            }
        }
    }</span>

具体类ConcreteHandler2的代码

<span style="font-family:KaiTi_GB2312;font-size:18px;"> class ConcreteHandler2 :Handler
    {
        public override void HandeleRequest(int request)
        {
            if (request > 10 && request <20)
            {
                Console.WriteLine("{0}处理请求{1}",this .GetType().Name ,request );
            }
            else if (successor != null)
            {
                successor.HandeleRequest(request);
            }
        }
    }</span>

具体类ConcreteHandler3的代码

<span style="font-family:KaiTi_GB2312;font-size:18px;">class ConcreteHandler3 :Handler
    {
        public override void HandeleRequest(int request)
        {
            if (request > 20)
            {
                Console.WriteLine("{0}处理请求{1}", this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandeleRequest(request);
            }

        }
    }</span>

客户端调用的代码

<span style="font-family:KaiTi_GB2312;font-size:18px;">static void Main(string[] args)
        {
            Handler h1 = new ConcreteHandler1();//创建ConcreteHandel1的具体实例
            Handler h2 = new ConcreteHandler2();//创建ConcreteHandel的具体实例
            Handler h3 = new ConcreteHandler3();
            h1.SetSuccessor(h2);                //设置职责链的后继继承者,h1的继承者为h2
            h2.SetSuccessor(h3);                //设置职责链的后继继承者,h2的继承者为h3
            int[] requsets = { 1,2,11,12,21,22};//定义一个整形的数组,存放整形数据
            foreach (int request in requsets)   //遍历数组 requsets中所有的数字,h1,h2,h3去处理。
            {
                h1.HandeleRequest(request);     //调用h1的方法,处理请求
            }
            Console.Read();
        }</span>

效果图如下所示

总结

职责链中最终要的是设置后继继承者,这样就形成了一条链,让客户端请求的问题沿着链传递下去。值得注意的是:我们要准确的准确的设置后继继承者,若请求到职责链的最后还没有解决,那就不好玩了。 职责链模式的优点:1、请求者不用关系那个对象处理其具体的请求。 2、紧紧保持一个指向其后继者的引用,而不需保持它所有的后继者的引用,降低了耦合度。以上便是我对职责链模式的简单理解,其实,重要还是在于学以致用。

时间: 2024-10-25 18:27:12

《设计模式》——职责链模式的相关文章

17. 星际争霸之php设计模式--职责链模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248202.html============================================

设计模式——职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. *在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收:在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收. 适用性 在以下条件下使用Responsibility 链: 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可动态指定一组对象处理

小菜学设计模式——职责链模式

背景 时间过得真快,转眼又是半年,可是作为一名将要资深的码农,是不是应该加薪了呢?可是说到加薪,经理又要推诿,这个不是我能决定的,你去找总监吧,总监又会说,在等等吧,等这个项目上线不会亏待你的.我的个神呀,这个产品上线估计要到明年春天吧!好吧,关于职责问题,这里就是一个著名的设计模式,职责链模式. 1.使用意图 把用户的请求,层层传递处理,直到这个请求被处理为止. 2.生活实例 工作加薪.请假. 3.Java 例子(框架.JDK .JEE) 暂时没有发现,如果有发现的同学可以提出修改. 4.模式

深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦.这就是职责链模式的模式动机. 模式定义职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个

与状态模式相似的设计模式---职责链模式

今天我们要讨论的设计模式与前面提到的状态模式非常相似,他们不能的地方:状态模式是每个具体的状态处理自己状态的事务,若非自己状态处理的数据则将状态移动到一下一个具体状态类处理:而职责链则是根据自己的职责完成本职工作,若不能完成则判断是否已经关联了下一个环节职责,若存在则调用下一环节的处理.他们两个一个是在具体类中已经设定了下一环节,而另外一个则是在客户端先设定好职责链. 什么是职责链模式?使多个对象(职责对象)都有机会处理请求,从而避免了请求发送者与接收者之间的耦合性.将这职责对象连成一条链,使得

PHP设计模式——职责链模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法. UML类图: 角色: 抽象处理者(Manager):定义出一个处理请求的接口.如果需要,接口可以定义出一个方法,以设定和返回对下家的引用.这个角色通常由一个抽象类或接口实现. 具体处理者(CommonManager):具体处理者接到请求后,可以

设计模式-职责链模式

1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止.    相信大家都写过if...else或者switch,当条件很多时需要写上数十行代码.如果要修改某些条件或者处理过程,就又要不断地修改这个牛叉的分支语句.这时我们可以采用职责链模式,它是将许多请求的分支或者步骤都独立出来.然后每个独立出来的部分,如果你是最终的处理那么就直接处理并结束,如果不是,那么就连接下一个处理步骤.这样就形成一个处理请求的链

大话设计模式-职责链模式

需求 实现一个公司里请假加薪等流程审批的程序. 实现 级别1 public class Request { private String requestType; private int number; public String getRequestType() { return requestType; } public void setRequestType(String requestType) { this.requestType=requestType; } public int g

JAVA 设计模式 职责链模式

用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 职责链模式是一种行为型模式. 结构 图-职责链模式 Handler : 定义一个处理请求的接口.(可选的)实现设置后继者的方法. abstract class Handler {    protected Handler successor;    public void SetSu

javascript设计模式——职责链模式

前面的话 职责链模式的定义是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.职责链模式的名字非常形象,一系列可能会处理请求的对象被连接成一条链,请求在这些对象之间依次传递,直到遇到一个可以处理它的对象,把这些对象称为链中的节点.本文将详细介绍职责链模式 电商订单 职责链模式的例子在现实中并不难找到,以下就是两个常见的跟职责链模式有关的场景 如果早高峰能顺利挤上公交车的话,那么估计这一天都会过得很开心.