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