设计模式之责任链模式

责任链模式 java

优势:
•责任链模式下降了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。
•因为是在客户端来定义责任链的结构,能够动态地增长或修改处理一个请求的结构,加强了给对象指派职责的灵活性。
缺点:
•责任链模式通常是从链子的开头位置进行遍历,找到时候的处理对象,对性能有必定的损耗。
适用场合:
•有多个的对象能够处理一个请求,哪一个对象处理该请求运行时刻自动肯定。
•想在不明确指定接收者的状况下,向多个对象中的一个提交一个请求。 
•可处理一个请求的对象集合应被动态指定。
•当一个方法的传入参数将成为分支语句的判断条件,分支条件存在扩展的可能,每个分支的职责相对独立,且逻辑较为复杂时。 ide

与状态模式的区别:
责任链模式注重责任的传递,而且责任链由客户端进行配置,具体的操做对象维护了一下后继者的引用(由客户端配置),若是本身可以处理,则处理,不能处理调用后继者处理。 性能

状态模式注重对象状态的转换,这个转换过程对客户端是透明的。重点是把状态的判断逻辑封装在“表示不一样状态的一系列类中”具体的操做完成后,修改被操做这的状态,这个状态的修改对客户端是透明的。 this

package com.perfecking.base;

import java.util.LinkedList;
import java.util.List;

public class ChainOfResponsibility {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FilterChain chain = new FilterChain();
		chain.addFiler(new AuthFilter());
		chain.addFiler(new LoginFilter());
		chain.doFilter(new Request(), new Response());
	}

}

class Request{
	private String reqMsg = null;
	public String getMsg(){
		return reqMsg;
	}
	public void setMsg(String reqMsg){
		this.reqMsg = reqMsg;
	}
}
class Response{
	private String respMsg = null;
	public String getMsg(){
		return respMsg;
	}
	public void setMsg(String respMsg){
		this.respMsg = respMsg;
	}
}
class FilterChain{
	private List<Filter> filters = new LinkedList<>();
	private int index = 0;
	public void addFiler(Filter filter){
		filters.add(filter);
	}
	public void doFilter(Request request,Response response){
		if(index==filters.size()){
			return;
		}
		Filter filter = filters.get(index++);
		filter.doFilter(request, response, this);
	}
}
interface Filter{
	public void doFilter(Request request,Response response,FilterChain chain);
}
class AuthFilter implements Filter{
	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		// TODO Auto-generated method stub
		if(request.getMsg().contains("perfecking")){
			response.setMsg("allowed visit.");
		}
		chain.doFilter(request, response);
	}
}
class LoginFilter implements Filter{

	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		// TODO Auto-generated method stub
		
	}
}



PS:
•纯责任链模规定一个具体的处理对象只能对请求做出处理请求或传给后继者两种动做,不能出现处理了一部分,把剩下的传给后继者处理的状况,并且请求在责任链中必须被处理。然而责任链模的思想在于,经过将多个处理对象创建关联,来达到请求与具体的某个处理者的解耦。因此在实际的需求中不必定非要达到一种纯责任链模式的设计。
•责任链模式并不建立责任链。责任链的建立必须由系统的其它部分建立出来。
•责任链能够是一个链能够是一条线,一个树,也能够是一个环。
•GoF规定一个请求必须被某一个处理者对象所处理,因此为了不一个请求有可能到了链的末端都得不处处理,或者由于没有正确配置而得不处处理,能够提供一个默认处理全部请求的对象。 spa

相关文章
相关标签/搜索