责任链模式/chain of responsibility/行为型模式

职责链模式 chain of responsibility

意图

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

动机

给多个对象处理一个请求的机会,从而解耦发送者和请求者。

从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者。提交请求的对象并不明确地知道哪一个对象将会处理它,可以当做是一个隐式接受者。
沿着链发送请求,并保证接受者为隐式的,每个链上的对象都有一致的处理请求和访问链上后继者的接口。

java实现三要素: 接口(处理请求+后继链)+具体实现(能处理请求就处理,否则转给后继链)

优点:
降低耦合,简化对象链接,仅需保持一个指向后继者的引用。

注意点:
链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象。

代码实现

/**
 * 定义操作和获得后继链
 *
 */
public interface Handler {
    void handle();

	Handler getNextHandler();
}


public class Handler1 implements Handler{
    private Handler handler=new Handler2(); 
	
	@Override
	public void handle() {
		System.out.println("this is handler 1.");
		if (getNextHandler()!=null) {//有后继,则往后传递
			getNextHandler().handle();
		}
	}

	@Override
	public Handler getNextHandler() {
		return handler;
	}
}

public class Handler2 implements Handler{
    
	@Override
	public void handle() {
		System.out.println("this is handler 2.");
		if (getNextHandler()!=null) {
			getNextHandler().handle();//无后继,终止。
		}
	}

	@Override
	public Handler getNextHandler() {
		return null;
	}
}

//测试
public class Test {

    public static void main(String[] args) {
		Handler handler=new Handler1();
		handler.handle();
	}
}

JDK中的责任链模式

把一个对象在一个链接传递直到被处理。在这个链上的所有的对象有相同的接口(抽象类)但却有不同的实现。
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()

posted @ 2016-09-27 15:23  toto怎么会喝醉  阅读(186)  评论(0编辑  收藏  举报