设计模式——责任链模式
责任链模式:将能够处理同一类请求的对象连成一条链所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,
如果能则处理,如果不能则传递给链上的下一个对象。
优点:将请求者和发送者解耦
简化对象的处理过程
可以通过改变链中的成员或成员的顺序来动态的新增或则删除责任。
缺点:不能保证请求一定会执行,可能或落到责任链之外。
不容易观察运行时的特征,处理请求的方法比较分散。
实现方式:链表和非链表两种实现,但是使用集合和数组等非链表实现在实际开发中更方便更常用。
应用:
窗口事件的处理。
Java中的异常机制就是一种责任链模式,catch链就是一种责任链。
JavaScript中的时间冒泡和捕获机制。
Servlet中的过滤器的链式处理。
Structs2中拦截器的调用。
这个解释很详细:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html
Demo:
package com.wxisme.chainofresposibility; /** * 责任链 * @author wxisme * */ public abstract class Handler { protected Handler nextHandler; public abstract void handleRequest(int req); public Handler getNextHandler() { return nextHandler; } public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } } class ConcreteHandler1 extends Handler { @Override public void handleRequest(int req) { if(req == 1) { System.out.println("1处理请求"); } else { System.out.println("1释放请求"); this.nextHandler.handleRequest(req); } } } class ConcreteHandler2 extends Handler { @Override public void handleRequest(int req) { if(req == 2) { System.out.println("2处理请求"); } else { System.out.println("2释放请求"); this.nextHandler.handleRequest(req); } } } class ConcreteHandler3 extends Handler { @Override public void handleRequest(int req) { if(req == 3) { System.out.println("3处理请求"); } else { System.out.println("3释放请求"); this.nextHandler.handleRequest(req); } } } public class Client { public static void main(String[] args) { Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.setNextHandler(h2); h2.setNextHandler(h3); h1.handleRequest(1); System.out.println("-----------"); h1.handleRequest(2); System.out.println("-----------"); h1.handleRequest(3); } }
运行结果:
1处理请求
-----------
1释放请求
2处理请求
-----------
1释放请求
2释放请求
3处理请求
作者:Pickle
声明:对于转载分享我是没有意见的,出于对博客园社区和作者的尊重一定要保留原文地址哈。
致读者:坚持写博客不容易,写高质量博客更难,我也在不断的学习和进步,希望和所有同路人一道用技术来改变生活。觉得有点用就点个赞哈。