设计模式——责任链模式

 

责任链模式:将能够处理同一类请求的对象连成一条链所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,

                 如果能则处理,如果不能则传递给链上的下一个对象。
优点:将请求者和发送者解耦
         简化对象的处理过程
         可以通过改变链中的成员或成员的顺序来动态的新增或则删除责任。

缺点:不能保证请求一定会执行,可能或落到责任链之外。

         不容易观察运行时的特征,处理请求的方法比较分散。
实现方式:链表和非链表两种实现,但是使用集合和数组等非链表实现在实际开发中更方便更常用。

应用:

窗口事件的处理。
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处理请求

 

posted @ 2015-06-04 00:27 Pickle 阅读(...) 评论(...) 编辑 收藏