引言
上一章我们将了代理模式,这一节我们说说责任链模式,目前的这几种模式都是比较简单的。
示例地址
类图
定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止。
责任链模式使用场景
1. 多个对象可以处理同一请求,但具体由那个对象处理则在运行时动态决定。
2. 在请求处理者不明确的情况下向多个对象中的一个提交。
3. 需要动态指定一组对象处理请求。
责任链模式示例
在古代,小百姓打官司都是先到知县,不合理到知府,然后巡抚。
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("巡抚");
总结
职责链的模式链的组成:
第一步需要在处理者对象类中定义后继处理者对象,将这部分代码抽象到抽象类中实现,降低了代码重复性。
第二步就是在处理者对象类中的处理方法中如果当前处理者对象无法处理,就将其传递到后继对象去处理。
第三步就是在测试类中将这些处理者类的实例串联成链。