责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
当数据要进行多次处理时,为了方便动态扩展,可以使用此模式。过滤器和拦截器都用到了此种模式。
1.只需要处理数据后,返回简单的处理结果
首先创建一个接口:
public interface DataFilter {
public void doFilter(DataRequest dataRequest, DataReponse dataReponse);
}
public class DataReponse {
private int dataType;
private String data;
public int getDataType() {
return dataType;
}
public void setDataType(int dataType) {
this.dataType = dataType;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
public class DataRequest {
private int dataType;
private String oldData;
private String handleData;
public int getDataType() {
return dataType;
}
public void setDataType(int dataType) {
this.dataType = dataType;
}
public String getOldData() {
return oldData;
}
public void setOldData(String oldData) {
this.oldData = oldData;
}
public String getHandleData() {
return handleData;
}
public void setHandleData(String handleData) {
this.handleData = handleData;
}
}
然后创建Handle 来处理数据:
public class NBDataFilter implements DataFilter {
@Override
public void doFilter(DataRequest dataRequest, DataReponse dataReponse) {
System.out.println("dataRequest:nb进来了");
System.out.println("dataReponse:nb进来了");
}
}
public class OneDataFilter implements DataFilter {
@Override
public void doFilter(DataRequest dataRequest,DataReponse dataReponse) {
System.out.println("dataRequest:nb进来了");
System.out.println("dataReponse:nb进来了");
}
}
public class UppFilter implements DataFilter{
@Override
public void doFilter(DataRequest dataRequest,DataReponse dataReponse) {
System.out.println("dataRequest:udp进来了");
System.out.println("dataReponse:udp进来了");
}
}
创建chain 来调用handle
public class DataChain implements DataFilter {
private List<DataFilter> dataFilters;
@Override
public void doFilter(DataRequest dataRequest, DataReponse dataReponse) {
for(int i=0;i<dataFilters.size();i++) {
dataFilters.get(i).doFilter(dataRequest, dataReponse);
}
}
public List<DataFilter> getDataFilter() {
return dataFilters;
}
public void setDataFilter(List<DataFilter> dataFilter) {
this.dataFilters = dataFilter;
}
}
测试类:
public class DataHandle {
public static void main(String[] args) {
DataChain dataChain = new DataChain();
List<DataFilter> dataFilters = new ArrayList<>();
dataFilters.add(new NBDataFilter());
dataFilters.add(new UppFilter());
dataFilters.add(new OneDataFilter());
dataChain.setDataFilter(dataFilters);
dataChain.doFilter(new DataRequest(), new DataReponse());
}
}
测试结果如下:
dataRequest:nb进来了
dataReponse:nb进来了
dataRequest:udp进来了
dataReponse:udp进来了
dataRequest:nb进来了
dataReponse:nb进来了
2.由前到后的顺序处理数据,由后到前返回数据结果
创建接口:
public interface DataFilter {
public void doFilter(DataRequest dataRequest, DataReponse dataReponse,DataChain dataFilter);
}
创建Handle 来处理数据:
public class NBDataFilter implements DataFilter {
@Override
public void doFilter(DataRequest dataRequest, DataReponse dataReponse,DataChain dataFilter) {
System.out.println("dataRequest:nb进来了");
dataFilter.doFilter(dataRequest, dataReponse, dataFilter);
System.out.println("dataReponse:nb进来了");
}
}
public class OneDataFilter implements DataFilter {
@Override
public void doFilter(DataRequest dataRequest,DataReponse dataReponse, DataChain dataChain) {
System.out.println("dataRequest:one进来了");
dataChain.doFilter(dataRequest, dataReponse, dataChain);
System.out.println("dataReponse:one进来了");
}
}
public class UppFilter implements DataFilter{
@Override
public void doFilter(DataRequest dataRequest,DataReponse dataReponse, DataChain dataChain) {
System.out.println("dataRequest:udp进来了");
dataChain.doFilter(dataRequest, dataReponse, dataChain);
System.out.println("dataReponse:udp进来了");
}
}
创建chain来管理handle
public class DataChain implements DataFilter {
private List<DataFilter> dataFilters;
private ThreadLocal<Integer> indexThreadLocal = new ThreadLocal<Integer>() {
public Integer initialValue() {
System.out.println(Thread.currentThread().getName()+"被初始化了");
return 0;
}
};
@Override
public void doFilter(DataRequest dataRequest, DataReponse dataReponse,DataChain dataChain) {
System.out.println(Thread.currentThread().getName()+" "+indexThreadLocal.hashCode());
int index = indexThreadLocal.get();
if(index == dataFilters.size()) {
indexThreadLocal.set(0);
return ;
}
DataFilter filter = dataFilters.get(index);
indexThreadLocal.set(++index);
filter.doFilter(dataRequest, dataReponse, dataChain);
}
public List<DataFilter> getDataFilter() {
return dataFilters;
}
public void setDataFilter(List<DataFilter> dataFilter) {
this.dataFilters = dataFilter;
}
}
测试类:
public class DataHandle {
public static void main(String[] args) {
DataChain dataChain = new DataChain();
List<DataFilter> dataFilters = new ArrayList<>();
dataFilters.add(new NBDataFilter());
dataFilters.add(new UppFilter());
dataFilters.add(new OneDataFilter());
dataChain.setDataFilter(dataFilters);
DataRequest dataRequest = new DataRequest();
dataRequest.setDataType(ConncetTypeNumber.CONNECTTYPE_HUAIWEI );
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
for( int i=0;i<2;i++){
newFixedThreadPool.execute(new Runnable() {
@Override
public void run() {
dataChain.doFilter(dataRequest, new DataReponse(),dataChain);
}
});
}
}
}
测试结果:
pool-1-thread-1被初始化了
pool-1-thread-2被初始化了
dataRequest:nb进来了
dataRequest:nb进来了
dataRequest:udp进来了
dataRequest:udp进来了
dataRequest:one进来了
dataRequest:one进来了
dataReponse:one进来了
dataReponse:udp进来了
dataReponse:nb进来了
dataReponse:one进来了
dataReponse:udp进来了
dataReponse:nb进来了