package com.test.design.chain;
public abstract class Handler {
private int type = 0;
private Handler next;
public Handler(int type){
this.type = type;
}
public void setNext(Handler handler){
this.next = handler;
}
public final void handle(Request request){
if(request.getType() == this.type){
this.handleRequest(request);
}else{
if(this.next != null){
next.handle(request);
}else{
System.out.println(" do nothing!");
}
}
}
public abstract void handleRequest(Request request);
}
package com.test.design.chain;
public class Request {
private int type = 0;
public Request(int type){
this.type = type;
}
public int getType(){
return this.type;
}
}
责任链模式屏蔽了请求的处理过程,你发起一个请求到底是谁处理的,这个你不用关心,只要你把请求抛给责任链的第一个处理者,最终会返回一个处理结果(当然也可以不做任何处理),作为请求者可以不用知道到底是需要谁来处理的。如项目开发的时候,需求确认是这样的:一个请求(比如银行客户存款的币种),一个处理者(只处理人民币),但是随着业务的发展(改革开放了嘛,还要处理美元、日元等等),处理者的数量和类型都有所增加,那这时候就可以在第一个处理者后面建立一个链,也就是责任链来处理请求,你是人民币,好,还是第一个业务逻辑来处理,你是美元,好,传递到第二个业务逻辑来处理,日元,欧元…,这些都不用在对原有的业务逻辑产生很大改变,通过扩展实现类就可以很好的解决这些需求变更的问题。
观察者模式也可以实现请求的传递,比如一个事件发生了,通知了观察者,同时观察者又作为一个被观察者,通知了另外一个观察者,这也形成了一个事件广播链,这和责任链是有区别的:
1.受众数量不同。观察者广播链式可以1:N 的方式广播,而责任链则要求是的1:1 的传递,必然有一个且只有一个类完成请求的处理;
2.请求内容不同。观察者广播链中的信息可以在传播中改变,但是责任链中的请求是不可改变的;
3.处理逻辑不同。观察者广播链主要用于触发联动动作,而责任链则是对一个类型的请求按照既定的规则进行处理。