引言
??上一章我們將了代理模式,這一節(jié)我們說說責任鏈模式,目前的這幾種模式都是比較簡單的。
示例地址
??Demo地址
類圖
image
定義
??使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,只到有對象處理它為止。
責任鏈模式使用場景
??1. 多個對象可以處理同一請求,但具體由那個對象處理則在運行時動態(tài)決定。
??2. 在請求處理者不明確的情況下向多個對象中的一個提交。
??3. 需要動態(tài)指定一組對象處理請求。
責任鏈模式示例
??在古代,小百姓打官司都是先到知縣,不合理到知府,然后巡撫。
1. 先定義一個當官的接口,他們有權利處理老百姓的告狀
/**
* 有權利的人
*
* @author 512573717@qq.com
* @created 2018/7/19 下午4:11.
*/
public abstract class DangGuan {
private DangGuan nextDangGuan;
public DangGuan getNextDangGuan() {
return nextDangGuan;
}
public void setNextDangGuan(DangGuan nextDangGuan) {
this.nextDangGuan = nextDangGuan;
}
//案情
abstract void anQing(String desc);
}
2. 知縣
/**
* 知縣
*
* @author 512573717@qq.com
* @created 2018/7/19 下午4:39.
*/
public class CountyGuan extends DangGuan {
@Override
void anQing(String desc) {
if (desc.equals("知縣")) {
System.out.println("知縣處理了此案情");
} else {
System.out.println("知縣:這案情我處理不了,我先上報");
getNextDangGuan().anQing(desc);
}
}
}
3. 知府
/**
* 知府
*
* @author 512573717@qq.com
* @created 2018/7/19 下午4:43.
*/
public class CityGuan extends DangGuan {
@Override
void anQing(String desc) {
if (desc.equals("知府")) {
System.out.println("知府處理了此案情");
} else {
System.out.println("知府:這案情我處理不了,我先上報");
getNextDangGuan().anQing(desc);
}
}
}
4. 巡撫
/**
* 巡撫
*
* @author 512573717@qq.com
* @created 2018/7/19 下午4:44.
*/
public class ProvinceGuan extends DangGuan {
@Override
void anQing(String desc) {
if (desc.equals("巡撫")) {
System.out.println("巡撫處理了此案情");
} else {
getNextDangGuan().anQing(desc);
}
}
}
5. 老百姓告狀
CountyGuan countyGuan = new CountyGuan();
CityGuan cityGuan = new CityGuan();
ProvinceGuan provinceGuan = new ProvinceGuan();
countyGuan.setNextDangGuan(cityGuan);
cityGuan.setNextDangGuan(provinceGuan);
System.out.println("老百姓開始告狀了。");
countyGuan.anQing("巡撫");
總結
??職責鏈的模式鏈的組成:
??第一步需要在處理者對象類中定義后繼處理者對象,將這部分代碼抽象到抽象類中實現(xiàn),降低了代碼重復性。
??第二步就是在處理者對象類中的處理方法中如果當前處理者對象無法處理,就將其傳遞到后繼對象去處理。
??第三步就是在測試類中將這些處理者類的實例串聯(lián)成鏈。