设计模式之责任链模式
2016-05-04 14:00
211 查看
责任链模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连城一条链,并沿着这条链传递该请求,直到有对象处理它为止。
优点:
将请求和处理分开,请求者可以不知道是谁处理的,处理者可以不用直到请求的全貌。两者解耦,提供系统的灵活性。
缺点:
1、性能问题,每个请求都是从连头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。
2、调试不很方便,调试逻辑可能比较复杂。
注意:
我们需要控制链表的长度,也就是说链中节点数量需要控制。一般是在Handler中设置一个最大节点数量,在setNext方法中判断是否已经超过其阀值,超过则不允许该链创建,避免无意识地破坏系统性能。
类图如下:
实现代码如下:
Handler抽象类:
父亲实现类:
丈夫实现类:
儿子实现类:
妇女抽象类:
妇女实现类:
测试类:
这就是责任链模式。
参考资料:
设计模式之禅
备注:
转载请注明出处
http://blog.csdn.net/wsyw126/article/details/51314127
by WSYW126
优点:
将请求和处理分开,请求者可以不知道是谁处理的,处理者可以不用直到请求的全貌。两者解耦,提供系统的灵活性。
缺点:
1、性能问题,每个请求都是从连头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。
2、调试不很方便,调试逻辑可能比较复杂。
注意:
我们需要控制链表的长度,也就是说链中节点数量需要控制。一般是在Handler中设置一个最大节点数量,在setNext方法中判断是否已经超过其阀值,超过则不允许该链创建,避免无意识地破坏系统性能。
类图如下:
实现代码如下:
Handler抽象类:
package com.designpatterns.chainofresponsibility; public abstract class Handler { public final static int FATHER_LEVEL_REQUEST = 1; public final static int HUSBAND_LEVEL_REQUEST = 2; public final static int SON_LEVEL_REQUEST = 3; private Handler nextHander; private int level =-1; public Handler(int level){ this.level=level; } public final void handleMessage(IWomen women){ if(this.level==women.getType()){ this.response(women); }else { if(this.nextHander!=null){ this.nextHander.handleMessage(women); }else { System.out.println("----------------------------------------"); System.out.println("没地方请示了,不同意!"); } } } protected abstract void response(IWomen women); public void setNextHander(Handler nextHander) { this.nextHander = nextHander; } }
父亲实现类:
package com.designpatterns.chainofresponsibility; public class Father extends Handler { public Father() { super(Handler.FATHER_LEVEL_REQUEST); } @Override protected void response(IWomen women) { System.out.println("--------------女儿向父亲请示-----------------"); System.out.println(women.getRequest()); System.out.println("父亲的回复是:同意"); } }
丈夫实现类:
package com.designpatterns.chainofresponsibility; public class Husband extends Handler { public Husband() { super(Handler.HUSBAND_LEVEL_REQUEST); } @Override protected void response(IWomen women) { System.out.println("--------------妻子向丈夫请示-----------------"); System.out.println(women.getRequest()); System.out.println("丈夫的回复是:同意"); } }
儿子实现类:
package com.designpatterns.chainofresponsibility; public class Son extends Handler { public Son() { super(Handler.SON_LEVEL_REQUEST); } @Override protected void response(IWomen women) { System.out.println("--------------母亲向儿子请示-----------------"); System.out.println(women.getRequest()); System.out.println("儿子的回复是:同意"); } }
妇女抽象类:
package com.designpatterns.chainofresponsibility; public interface IWomen { public int getType(); public String getRequest(); }
妇女实现类:
package com.designpatterns.chainofresponsibility; public class Women implements IWomen{ private int type = 5; private String request=""; public Women(int type,String request) { this.type=type; switch (this.type) { case 1: this.request="女儿的请求是:"+request; break; case 2: this.request="妻子的请求是:"+request; break; case 3: this.request="母亲的请求是:"+request; break; default: break; } } public int getType() { return this.type; } public String getRequest() { return this.request; } }
测试类:
package com.designpatterns.chainofresponsibility; import java.util.ArrayList; import java.util.Random; public class Client { public static void main(String[] args) throws InterruptedException { Father f = new Father(); Son s = new Son(); Husband h = new Husband(); f.setNextHander(h); h.setNextHander(s); ArrayList<Women> al = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 20; i++) { al.add(new Women(random.nextInt(4), "我要逛街")); } for (Women Women : al) { f.handleMessage(Women); } } }
这就是责任链模式。
参考资料:
设计模式之禅
备注:
转载请注明出处
http://blog.csdn.net/wsyw126/article/details/51314127
by WSYW126
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用