《设计模式》——职责链模式
来源:互联网 发布: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、紧紧保持一个指向其后继者的引用,而不需保持它所有的后继者的引用,降低了耦合度。以上便是我对职责链模式的简单理解,其实,重要还是在于学以致用。
- 《设计模式》——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链
- 设计模式——职责链
- 设计模式—职责连模式
- 设计模式—职责连模式
- 职责链设计模式
- 【设计模式】职责链
- 设计模式---职责链
- 职责链设计模式
- 职责链设计模式
- 每日设计模式——职责链模式
- C#设计模式之14——职责链模式
- java设计模式——职责链模式
- OOP设计模式[JAVA]——03职责链模式
- Android应用防止截屏
- android中多选ListView的实现
- 回憶 那時年少(一)
- Codeforces Round #306 (Div. 2)
- 大学借书记录
- 《设计模式》——职责链模式
- iOS开发多线程—07GCD的基本使用
- 下载编译好的gdal库
- 欧拉计划(12)Highly divisible triangular number
- 请保持正常的心思
- 【机房重构】知识点积累
- socket通信之——同步选择机制select()与异步选择机制WSAASyncSelect()的探讨
- IOS开发多线程—08GCD的常见用法
- 黑马程序员_匿名内部类