設計模式之一:責任鏈
阿新 • • 發佈:2019-01-10
概念:
使多個物件都有機會處理請求,從而避免了請求的傳送和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。
用圖形定義:
程式碼表示:
比如新生開學流程:先去報到,再去買盆子、被子,再去買書,我們按照這個流程先來設計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);
}
測試結果:去報到,買好盆子,買好書。