码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-08 09:56:44      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:设计模式   对象   uml   c#   

    职责链模式(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、紧紧保持一个指向其后继者的引用,而不需保持它所有的后继者的引用,降低了耦合度。以上便是我对职责链模式的简单理解,其实,重要还是在于学以致用。

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

标签:设计模式   对象   uml   c#   

原文地址:http://blog.csdn.net/zhoukun1008/article/details/46404175

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!