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

    职责链模式(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的代码

abstract class Handler
    {
        protected Handler successor;
        public void SetSuccessor(Handler successor1)  //设置继承者
        {
            this.successor = successor1;
        }
        public abstract void HandeleRequest(int request);//定义抽象方法,让子根据具体的实际情况重写。
    }


   具体类ConcreteHandler1的代码

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


   具体类ConcreteHandler2的代码

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


    具体类ConcreteHandler3的代码

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

        }
    }


   客户端调用的代码

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


   效果图如下所示


    总结

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值