设计模式之一:责任链

时间:2022-10-01 07:26:03

概念:

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

设计模式之一:责任链

代码表示:

比如新生开学流程:先去报到,再去买盆子、被子,再去买书,我们按照这个流程先来设计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);

}

测试结果:去报到,买好盆子,买好书。