Java設(shè)計(jì)模式編程中的責(zé)任鏈模式使用示例
責(zé)任鏈模式:多個(gè)對(duì)象由其對(duì)象對(duì)應(yīng)下家的引用連成一條鏈,請(qǐng)求在這個(gè)鏈上傳遞,直到 鏈上的某一個(gè)接收對(duì)象處理此請(qǐng)求。因?yàn)檎?qǐng)求的客戶端并不知道鏈上最終是誰(shuí)來(lái)處理這個(gè)請(qǐng)求,使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任, 從而避免了請(qǐng)求發(fā)送者與請(qǐng)求處理者之間的耦合。
責(zé)任鏈械中涉及到三種角色:
1,抽象處理者角色
2,具體處理者角色
3,請(qǐng)求發(fā)送者
小例子:假設(shè)去買房子,買房子就需要砍價(jià), 賣房的人職位不同,可以優(yōu)惠的價(jià)格也不同,不同職位就可以形成一個(gè)處理請(qǐng)求的鏈。我們暫定: * 基層銷售員,只能優(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 + " 處理了請(qǐng)求");
if (getSuccessor() != null) {
getSuccessor().handleFilter();
}
}
@Override
public void handleFilter2() {
/*
* 有后繼者就后繼者處理, 否則自己處理
*/
if (getSuccessor() != null) {
getSuccessor().handleFilter2();
} else {
System.out.println(name + " 處理了請(qǐng)求");
}
}
}
public class Test {
public static void main(String[] args) {
IFilter filter1 = new ConcreteFilter("permission-filter");//權(quán)限過(guò)濾
IFilter filter2 = new ConcreteFilter("suffix-filter");//后綴名過(guò)濾
IFilter filter3 = new ConcreteFilter("style-filter");//風(fēng)格過(guò)濾
filter1.setSuccessor(filter2);
filter2.setSuccessor(filter3);
System.out.println("------以下是每一個(gè)處理者(包括后繼者)都處理了, 順序也是一級(jí)一級(jí)的傳遞------");
filter1.handleFilter();
System.out.println("------以下是交由最后一個(gè)后繼者處理------");
filter1.handleFilter2();
}
}
打印:
------以下是每一個(gè)處理者(包括后繼者)都處理了, 順序也是一級(jí)一級(jí)的傳遞------ permission-filter 處理了請(qǐng)求 suffix-filter 處理了請(qǐng)求 style-filter 處理了請(qǐng)求 ------以下是交由最后一個(gè)后繼者處理------ style-filter 處理了請(qǐng)求
- 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é)任鏈模式簡(jiǎn)介
- 詳解Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
相關(guān)文章
Spring Boot調(diào)用 Shell 腳本實(shí)現(xiàn)看門狗功能
這篇文章主要介紹了Spring Boot調(diào)用 Shell 腳本實(shí)現(xiàn)看門狗功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
SpringBoot接口或方法進(jìn)行失敗重試的實(shí)現(xiàn)方式
為了防止網(wǎng)絡(luò)抖動(dòng),影響我們核心接口或方法的成功率,通常我們會(huì)對(duì)核心方法進(jìn)行失敗重試,如果我們自己通過(guò)for循環(huán)實(shí)現(xiàn),會(huì)使代碼顯得比較臃腫,所以本文給大家介紹了SpringBoot接口或方法進(jìn)行失敗重試的實(shí)現(xiàn)方式,需要的朋友可以參考下2024-07-07
Spring Boot 整合 Mockito提升Java單元測(cè)試的高效實(shí)踐案例
Mockito與Spring Boot的整合為Java開發(fā)者提供了一套完整的解決方案,使得單元測(cè)試更為精準(zhǔn)、高效,從而確保了代碼質(zhì)量、降低了維護(hù)成本,并促進(jìn)了項(xiàng)目的持續(xù)集成與交付,感興趣的朋友跟隨小編一起看看吧2024-04-04
springboot如何獲取接口下所有實(shí)現(xiàn)類
這篇文章主要介紹了springboot如何獲取接口下所有實(shí)現(xiàn)類問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
java連接Access數(shù)據(jù)庫(kù)的方法
這篇文章主要為大家詳細(xì)介紹了java連接Access數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Mybatis如何解決sql中l(wèi)ike通配符模糊匹配問(wèn)題
這篇文章主要介紹了Mybatis如何解決sql中l(wèi)ike通配符模糊匹配問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring中Bean的創(chuàng)建流程詳細(xì)解讀
這篇文章主要介紹了Spring中Bean的創(chuàng)建流程詳細(xì)解讀,Spring 中創(chuàng)建 Bean ,是通過(guò)調(diào)用 GetBean 方法來(lái)觸發(fā)的,所以,我們會(huì)從這個(gè)方法開始,需要的朋友可以參考下2023-10-10
Mybatis plus中使用in查詢出錯(cuò)如何解決
這篇文章主要介紹了Mybatis plus中使用in查詢出錯(cuò)的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
idea?maven?經(jīng)常主目錄自動(dòng)變回默認(rèn)的解決方法
很多朋友反映idea?maven?經(jīng)常主目錄自動(dòng)變回默認(rèn),遇到這樣的問(wèn)題真的很頭疼,該如何解決呢?下面小編給大家介紹下idea?maven目錄變回默認(rèn)的解決方法,需要的朋友可以參考下2022-08-08

