java設(shè)計(jì)模式之責(zé)任鏈模式

設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的,設(shè)計(jì)模式使代碼編制真正工程化,設(shè)計(jì)模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項(xiàng)目中合理的運(yùn)用設(shè)計(jì)模式可以完美的解決很多問題,每種模式在現(xiàn)在中都有相應(yīng)的原理來與之對應(yīng),每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的核心解決方案,這也是它能被廣泛應(yīng)用的原因.下面主要說一說責(zé)任鏈模式.

  • 責(zé)任鏈模式是一種對象的行為模式.在責(zé)任鏈模式里面,很多對象由每一個(gè)對象對其下家的引用而連接起來形成一條鏈.請求在這個(gè)鏈上進(jìn)行傳遞,直到這個(gè)鏈上的某一個(gè)對象來處理請求,發(fā)送這個(gè)請求的客戶端并不知道哪一個(gè)對象最終來處理這個(gè)請求.這使得系統(tǒng)可以在不影響客戶端的情況下來動(dòng)態(tài)的重新組織和分配責(zé)任.

下面說說比較常見的一個(gè)例子,在我們開發(fā)過程中,我們可能為了一個(gè)判斷一個(gè)語句,常常會(huì)寫出大量的if else語句,這使得我們在后期的維護(hù)和開發(fā)上可能會(huì)存在大量的麻煩,每當(dāng)我們增加一個(gè)新的判斷,都需要在原來的代碼上面進(jìn)行修改,這很顯然不符合開閉原則(對修改關(guān)閉,對擴(kuò)展開放).在這種情況下,我們就可以考慮使用責(zé)任鏈模式了.由于只是簡單介紹了一下該模式,所以demo就做的比較簡單了.廢話不多說了,直接上代碼.先看一下目錄結(jié)構(gòu):

責(zé)任鏈.png

AbstractAction.java

 package com.rain.design.abliti;

 public abstract class AbstractAction implements Action{

    public Action action;
    @Override
    public void todo(String type) {
    
        System.out.println("我是總部,你們處理不了就給我處理!!");
    }

    public Action getAction() {
        return action;
    }
    public void setAction(Action action) {
        this.action = action;
    }
}

Action.java

 package com.rain.design.abliti;
    public interface Action {
      void todo(String type);
  }

Guangdong.java

package com.rain.design.abliti;

public class Guangdong extends AbstractAction{

    private static final String type="廣東";
    @Override
    public void todo(String type) {
        if(this.type.equals(type)){
          System.out.println("我是廣東處理中心,我只處理廣東的業(yè)務(wù)");
        }else{
            Action action = this.getAction();

            if (action != null) {
                action.todo(type);
            }else{
                super.todo(type);
            }
        }
    }
}

Hubei.java

package com.rain.design.abliti;

public class Hubei extends AbstractAction{
    private static final String type="湖北";
    @Override
    public void todo(String type) {
        if(this.type.equals(type)){
            System.out.println("我是湖北處理中心,我只處理湖北的業(yè)  務(wù)");
        }else{
            Action action = this.getAction();

            if (action != null) {
                action.todo(type);
            }else{
                super.todo(type);
            }
        }
    }
}

Test.java

package com.rain.design.abliti;

public class Test {

public static void main(String[] args) {
    
    String type = "廣東";

    Hunan hunan = new Hunan();
    Hubei hubei = new Hubei();
    Jiangxi jiangxi = new Jiangxi();
    Guangdong guangdong = new Guangdong();
    
    hunan.setAction(hubei);
    hubei.setAction(jiangxi);
    jiangxi.setAction(guangdong);
    guangdong.setAction(null);

    hunan.todo(type);
  }
}

下面的就不貼了,都是類似的了.現(xiàn)在,當(dāng)我們的type為"廣東"時(shí),前面的type匹配不上的時(shí)候,就會(huì)依次向后傳遞任務(wù),直到有一個(gè)對象可以處理.另外,比如說我們又加了一個(gè)新的需求,河北也需要來處理這個(gè)任務(wù),我們只需要再寫一個(gè)類來繼承AbstractAction它就可以了,里面就是由它來處理自己的邏輯了,對原來的代碼不會(huì)有所改動(dòng),這也就符合了開閉原則,也極大的節(jié)約了我們的開發(fā)時(shí)間.如果還是以前的方式來改動(dòng)的話,有很大的可能會(huì)出錯(cuò),并且大量的if else嵌套看起來也不爽.

好了,本文也只是對責(zé)任鏈模式的一點(diǎn)粗淺的理解,希望能啟到一點(diǎn)拋磚引玉的作用,歡迎各位大神拍磚指正.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容