概念:
使多个对象都有机会处理请求,从而避免了请求的发送和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
用图形定义:
代码表示:
比如新生开学流程:先去报到,再去买盆子、被子,再去买书,我们按照这个流程先来设计3个 处理器:分别处理报到,盆子和书的事情:
//通用接口
public interface Processer {
String process(String str);
}
// 报到处理器;
public class ReportProcess implements Processer{
@Override
public String process(String str) {
return str.replace("去报到", "报到成功");
}
}
//盆子处理器
public class PenziProcess implements Processer{
@Override
public String process(String str) {
return str.replace("买盆子", "买好盆子");
}
}
//书本处理器
public class BookProcess implements Processer{
@Override
public String process(String str) {
return str.replace("买书", "买好书");
}
}
//所有事物在此类中处理:
public class AllProcess {
private String msg;
private Processer[] processers = {new ReportProcess(),new PenziProcess(),new BookProcess()};
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String handle(){
String r =msg;
for(Processer pro:processers){
r = pro.process(r);
}
return r;
}
}
//再看main类测试结果:
public static void main(String[] args) {
String msg= "去报到,买盆子,买书";
AllProcess ap = new AllProcess();
ap.setMsg(msg);
String result = ap.handle();
System.out.println(result);
}
运行结果是:报到成功,买好盆子,买好书。这说明,整个任务在各个处理链上处理成功。
扩展:
如果已经有一系列的处理器,需要增加到责任链上去,那么在设计的时候,这一些列的处理器也可当做是一个处理器,里面封装好处理逻辑,同时,也可以将单独的处理器添加到该系列上.
// 一系列的处理器
public class ChainProcess implements Processer{
private List<Processer> list = new ArrayList<Processer>();
public ChainProcess add(Processer p){
list.add(p);
return this;
}
public List<Processer> getList() {
return list;
}
public void setList(List<Processer> list) {
this.list = list;
}
@Override
public String process(String str) {
String result = str;
for(Processer po:list){
result = po.process(result);
}
return result;
}
}
// 测试:只调用2个处理器
public static void main(String[] args) {
String msg= "去报到,买盆子,买书";
AllProcess ap = new AllProcess();
ChainProcess cp = new ChainProcess();
cp.add(new BookProcess()).add(new PenziProcess());
ap.setCp(cp);
ap.setMsg(msg);
String result = ap.handle();
System.out.println(result);
}
测试结果:去报到,买好盆子,买好书。