Java設(shè)計(jì)模式編程中的責(zé)任鏈模式使用示例
責(zé)任鏈模式:多個(gè)對象由其對象對應(yīng)下家的引用連成一條鏈,請求在這個(gè)鏈上傳遞,直到 鏈上的某一個(gè)接收對象處理此請求。因?yàn)檎埱蟮目蛻舳瞬⒉恢梨溕献罱K是誰來處理這個(gè)請求,使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任, 從而避免了請求發(fā)送者與請求處理者之間的耦合。
責(zé)任鏈械中涉及到三種角色:
1,抽象處理者角色
2,具體處理者角色
3,請求發(fā)送者
小例子:假設(shè)去買房子,買房子就需要砍價(jià), 賣房的人職位不同,可以優(yōu)惠的價(jià)格也不同,不同職位就可以形成一個(gè)處理請求的鏈。我們暫定: * 基層銷售員,只能優(yōu)惠3% * 銷售經(jīng)理:可以優(yōu)惠5% * 銷售總監(jiān):可以優(yōu)惠8% * 老板(Boss):優(yōu)惠10%
Java實(shí)例
類圖:
/** * 抽象責(zé)任 */ public abstract class IFilter { private IFilter successor; public IFilter getSuccessor() { return successor; } public void setSuccessor(IFilter successor) { this.successor = successor; } public abstract void handleFilter(); public abstract void handleFilter2(); }
/** * 具體責(zé)任 */ public class ConcreteFilter extends IFilter { private String name; public ConcreteFilter(String name) { this.name = name; } @Override public void handleFilter() { /* * 自己先處理,如有后繼者,再由它處理一次 */ System.out.println(name + " 處理了請求"); if (getSuccessor() != null) { getSuccessor().handleFilter(); } } @Override public void handleFilter2() { /* * 有后繼者就后繼者處理, 否則自己處理 */ if (getSuccessor() != null) { getSuccessor().handleFilter2(); } else { System.out.println(name + " 處理了請求"); } } }
public class Test { public static void main(String[] args) { IFilter filter1 = new ConcreteFilter("permission-filter");//權(quán)限過濾 IFilter filter2 = new ConcreteFilter("suffix-filter");//后綴名過濾 IFilter filter3 = new ConcreteFilter("style-filter");//風(fēng)格過濾 filter1.setSuccessor(filter2); filter2.setSuccessor(filter3); System.out.println("------以下是每一個(gè)處理者(包括后繼者)都處理了, 順序也是一級一級的傳遞------"); filter1.handleFilter(); System.out.println("------以下是交由最后一個(gè)后繼者處理------"); filter1.handleFilter2(); } }
打?。?/p>
------以下是每一個(gè)處理者(包括后繼者)都處理了, 順序也是一級一級的傳遞------ permission-filter 處理了請求 suffix-filter 處理了請求 style-filter 處理了請求 ------以下是交由最后一個(gè)后繼者處理------ style-filter 處理了請求
- Java設(shè)計(jì)模式之責(zé)任鏈模式的概念、實(shí)現(xiàn)以及netty中的責(zé)任鏈模式
- Java設(shè)計(jì)模式之責(zé)任鏈模式
- 23種設(shè)計(jì)模式(19)java責(zé)任鏈模式
- Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式原理與用法詳解
- 實(shí)例講解Java的設(shè)計(jì)模式編程中責(zé)任鏈模式的運(yùn)用
- JAVA設(shè)計(jì)模式之責(zé)任鏈模式詳解
- Java設(shè)計(jì)模式之責(zé)任鏈模式(Chain of Responsibility模式)介紹
- Java設(shè)計(jì)模式之責(zé)任鏈模式簡介
- 詳解Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
相關(guān)文章
Java簡單實(shí)現(xiàn)SpringMVC+MyBatis分頁插件
自己最近搭建的一個(gè)SpringMVC+Mybatis的框架 屬于無實(shí)體類的框架 并實(shí)現(xiàn)了Myabtis的自動分頁和總數(shù)查詢 只要傳入分頁參數(shù)便能自動查詢總數(shù)和分頁 總數(shù)封裝在參數(shù)里面執(zhí)行查詢后可以直接從參數(shù)中獲取2015-09-09Kotlin基礎(chǔ)教程之?dāng)?shù)據(jù)類型
這篇文章主要介紹了Kotlin基礎(chǔ)教程之?dāng)?shù)據(jù)類型的相關(guān)資料,需要的朋友可以參考下2017-05-05Java中Dijkstra算法求解最短路徑的實(shí)現(xiàn)
Dijkstra算法是一種解決最短路徑問題的常用算法,本文主要介紹了Java中Dijkstra算法求解最短路徑的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Spring Boot整合MyBatis連接Oracle數(shù)據(jù)庫的步驟全紀(jì)錄
這篇文章主要給大家介紹了關(guān)于Spring Boot整合MyBatis連接Oracle數(shù)據(jù)庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07超細(xì)致講解Spring框架 JdbcTemplate的使用
在之前的Javaweb學(xué)習(xí)中,學(xué)習(xí)了手動封裝JdbcTemplate,其好處是通過(sql語句+參數(shù))模板化了編程。而真正的JdbcTemplate類,是Spring框架為我們寫好的。它是 Spring 框架中提供的一個(gè)對象,是對原始 Jdbc API 對象的簡單封裝。2021-09-09Flink自定義Sink端實(shí)現(xiàn)過程講解
這篇文章主要介紹了Flink自定義Sink端實(shí)現(xiàn)過程,在Fink官網(wǎng)中sink端只是給出了常規(guī)的write api.在我們實(shí)際開發(fā)場景中需要將flink處理的數(shù)據(jù)寫入kafka,hbase kudu等外部系統(tǒng)2023-01-01