設計模式——職責鏈模式

來源:互聯網
上載者:User

標籤:

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

*在一個純的職責鏈模式裡面,一個請求必須被某一個處理者對象所接收;在一個不純的職責鏈模式裡面,一個請求可以最終不被任何接收端對象所接收。

適用性
  在以下條件下使用Responsibility 鏈:
  有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
  你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
  可動態指定一組對象處理請求。

模式的組成
  抽象處理者角色(Handler:Approver):定義一個處理請求的介面,和一個後繼串連(可選)
  具體處理者角色(ConcreteHandler:President):處理它所負責的請求,可以訪問後繼者,如果可以處理請求則處理,否則將該請求轉給他的後繼者。
  客戶類(Client):向一個鏈上的具體處理者ConcreteHandler對象提交請求。

優點

  降低耦合度 :該模式使得一個對象無需知道是其他哪一個對象處理其請求。對象僅需知道該請求會被“正確”地處理。接收者和寄件者都沒有對方的明確的資訊,且鏈中的對象不需知道鏈的結構。
  職責鏈可簡化對象的相互串連:結果是,職責鏈可簡化對象的相互串連。它們僅需保持一個指向其後繼者的引用,而不需保持它所有的候選接受者的引用。
  增強了給對象指派職責(Responsibility)的靈活性:當在對象中指派職責時,職責鏈給你更多的靈活性。你可以通過在運行時刻對該鏈進行動態增加或修改來增加或改變處理一個請求的那些職責。你可以將這種機制與靜態特例化處理對象的繼承機制結合起來使用。
  增加新的請求處理類很方便

缺點

  不能保證請求一定被接收。既然一個請求沒有明確的接收者,那麼就不能保證它一定會被處理 —該請求可能一直到鏈的末端都得不到處理。一個請求也可能因該鏈沒有被正確配置而得不到處理。
  系統效能將受到一定影響,而且在進行代碼調試時不太方便;可能會造成迴圈調用。

實現

  人類的發展,然後對人類的需求進行分析實現。類圖如下:

AbstractHuman的定義:

package com.lidaming.design18.chain;public abstract class AbstractHuman {    public AbstractHuman human;    public void setHuman(AbstractHuman huamn){        this.human=huamn;    }    public abstract void process(String need);}
View Code

FoodManager的定義:

package com.lidaming.design18.chain;public class FoodMananger extends AbstractHuman {     @Override    public void process(String need) {        if(need=="food")        {            System.out.println("food is enough");        }        else        {            if(human!=null)            {                human.process(need);            }            else            {                System.out.println("sorry,i have no food");            }        }    }}
View Code

ToolManager的定義:

package com.lidaming.design18.chain;public class ToolMananger extends AbstractHuman {    @Override    public void process(String need) {        if(need=="tool")        {            System.out.println("give you a tool");        }        else        {            if(human!=null)            {                human.process(need);            }            else            {                System.out.println("sorry,we can not for you");            }        }    }}
View Code

HumanManager的定義:

package com.lidaming.design18.chain;public class HumanManager extends AbstractHuman {    @Override    public void process(String need) {        if (need.equals("job")) {            System.out.println("give u an offer");        } else {            if (human != null) {                human.process(need);            } else {                System.out.println("no offer for u");            }        }    }}
View Code

情境類的實現:

package com.lidaming.design18.chain;public class Client {    public static void main(String[] args) {        FoodMananger food = new FoodMananger();        ToolMananger tool = new ToolMananger();        HumanManager human = new HumanManager();        food.setHuman(tool);        tool.setHuman(human);        food.process("tool");        food.process("aa");    }}
View Code

 

參考
http://www.jayfeng.com/2016/04/09/理解設計模式之狀態模式、職責鏈模式/
http://blog.csdn.net/hguisu/article/details/7547231

設計模式——職責鏈模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.