摘要:設計模式責任鏈模式顧名思義,責任鏈模式為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。
設計模式 - 責任鏈模式
顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬于行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。
簡單的說就是: 你處理不了的事情就交給你的下一級(級別更高)的去處理。介紹:
意圖:避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。
主要解決:職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的發送者和請求的處理者解耦了。在某一場景是可以減少大量的if else代碼
優點: 1、降低耦合度。它將請求的發送者和接收者解耦。 2、簡化了對象。使得對象不需要知道鏈的結構。 3、增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。 4、增加新的請求處理類很方便。
缺點: 1、不能保證請求一定被接收。 2、系統性能將受到一定影響,而且在進行代碼調試時不太方便,可能會造成循環調用。 3、可能不容易觀察運行時的特征,有礙于除錯。
話不多說直接上代碼
創建一個抽象的程序員類:AbstractCoder
public abstract class AbstractCoder { public static int SIMPLEBUG = 1; public static int COMPLEXBUG = 2; public static int DIFFICULTBUG = 3; protected int level; protected AbstractCoder nextCoder; public void setNextCoder(AbstractCoder nextCoder) { this.nextCoder = nextCoder; } public void resolveBug(int level, String message) { //大于處理的權限 if (this.level < level) { nextCoder.resolveBug(level, message); } else { write(message); } } abstract protected void write(String message); }
創建不同的程序員類去擴展抽象類,每個程序員做著不同的事情。
LongHairCoder:
public class LongHairCoder extends AbstractCoder { public LongHairCoder(int level) { this.level = level; } @Override protected void write(String message) { System.out.println("初級程序員處理:" + message); } }
ShortHairCoder:
public class ShortHairCoder extends AbstractCoder { public ShortHairCoder(int level) { this.level = level; } @Override protected void write(String message) { System.out.println("禿頭程序員處理:" + message); } }
BaldHeadCoder:
public class BaldHeadCoder extends AbstractCoder { public BaldHeadCoder(int level) { this.level = level; } @Override protected void write(String message) { System.out.println("光頭程序員處理:" + message); } }
實現責任鏈: ChainPatternDemo
public class ChainPattern { public static AbstractCoder getChainOfLoggers() { AbstractCoder longHairCoder = new LongHairCoder(AbstractCoder.SIMPLEBUG); AbstractCoder shortHairCoder = new ShortHairCoder(AbstractCoder.COMPLEXBUG); AbstractCoder baldHeadCoder = new BaldHeadCoder(AbstractCoder.DIFFICULTBUG); longHairCoder.setNextCoder(shortHairCoder); shortHairCoder.setNextCoder(baldHeadCoder); return longHairCoder; } public static void main(String[] args) { AbstractCoder abstractCoder = getChainOfLoggers(); abstractCoder.resolveBug(AbstractCoder.SIMPLEBUG, "一個簡單的bug"); abstractCoder.resolveBug(AbstractCoder.COMPLEXBUG, "一個復雜的bug"); abstractCoder.resolveBug(AbstractCoder.DIFFICULTBUG, "一個困難的bug"); } }
執行結果:
初級程序員處理:一個簡單的bug 禿頭程序員處理:一個復雜的bug 光頭程序員處理:一個困難的bug
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73564.html
摘要:看起來沒有集合框架,線程,等那么耀眼,但它可是很多框架的基礎啊回復反射查看相關文章,先把基礎學會,后面的得用到它。 回頭看看, 我進入Java 領域已經快15個年頭了, 雖然學的也一般, 但是分享下我的心得,估計也能幫大家少走點彎路。[入門]我在2001年之前是C/C++陣營, 有C和面向對象的基礎, 后來轉到Java ,發現沒有指針的Java真是好簡單, 另外Java 的類庫好用的讓...
摘要:面試官要不你來手寫下單例模式唄候選者單例模式一般會有好幾種寫法候選者餓漢式簡單懶漢式在方法聲明時加鎖雙重檢驗加鎖進階懶漢式靜態內部類優雅懶漢式枚舉候選者所謂餓漢式指的就是還沒被用到,就直接初始化了對象。面試官:我看你的簡歷寫著熟悉常見的設計模式,要不你來簡單聊聊你熟悉哪幾個吧?候選者:常見的工廠模式、代理模式、模板方法模式、責任鏈模式、單例模式、包裝設計模式、策略模式等都是有所了解的候選者:...
摘要:前言近期在做的攔截器功能,正好用到了責任鏈模式。通過官方圖就可以非常清楚的看出是一個責任鏈模式用責任鏈模式設計一個攔截器對于攔截器來說使用責任鏈模式再好不過了。設置攔截器到責任鏈中時通過反射將的值保存到各個攔截器中。 showImg(https://segmentfault.com/img/remote/1460000016756077?w=1733&h=1300); 前言 近期在做 ...
閱讀 844·2023-04-25 21:21
閱讀 3226·2021-11-24 09:39
閱讀 3067·2021-09-02 15:41
閱讀 1995·2021-08-26 14:13
閱讀 1827·2019-08-30 11:18
閱讀 2768·2019-08-29 16:25
閱讀 507·2019-08-28 18:27
閱讀 1580·2019-08-28 18:17