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

来源:互联网 发布:php前台模板 编辑:程序博客网 时间:2024/05/01 18:40

    职责链模式(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 0
原创粉丝点击