1. 程式人生 > >設計模式之一:責任鏈

設計模式之一:責任鏈

概念:

使多個物件都有機會處理請求,從而避免了請求的傳送和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。
用圖形定義:

這裡寫圖片描述

程式碼表示:

比如新生開學流程:先去報到,再去買盆子、被子,再去買書,我們按照這個流程先來設計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);

    }

測試結果:去報到,買好盆子,買好書。