1 介绍
职责链模式也叫责任链模式,理解它可以用数据结构链表去理解。
2 例子
去火车站找人,假设家人不幸丢失,去一个陌生的地方找人,人生地不熟,先随便去个火车站或者汽车站找,如果没有找到警察叔叔就会说要不去飞机场试试看看,就这样一个个的找。
2.1 站台父类
abstract class Station{
//属性
public List<String> names=new ArrayList<>();
public String stationName;
public Station nextStation;
//找到了这个人
public void find(String name){
if(names.contains(name)){
System.out.println("在"+this.stationName+"找到了"+name);
}
else {
nextStation.find(name);
}
}
}
2.2 站台实现类
class TrainStation extends Station{
TrainStation(){
super.stationName="火车站";
super.names.add("李建国");
super.names.add("刘大刚");
}
}
class Airport extends Station{
Airport(){
super.stationName="飞机场";
super.names.add("张三");
super.names.add("李四");
}
}
class BusStation extends Station{
BusStation(){
super.stationName="汽车站";
super.names.add("王五");
super.names.add("柳飘飘");
}
}
2.3 主测试类
public class Main {
public static Station getChain(){
//创建各自的站
Station busStation=new BusStation();
Station airport=new Airport();
Station trainStation=new TrainStation();
//各自首尾相接连接起来
busStation.nextStation=airport;
airport.nextStation=trainStation;
trainStation.nextStation=busStation;
//随便返回一个站都可以
return airport;
}
public static void main(String[] args) {
//建链
Station station=getChain();
//找人
station.find("王五");
station.find("李建国");
station.find("张三");
}
}
注意要有一个建链(本例采用环形链)的方法,对客户端暴露的方法就是去任意一个站台,然后递归寻找就可以。
在汽车站找到了王五
在火车站找到了李建国
在飞机场找到了张三
3 总结
3.1 核心结构
- 节点父类:包含下一个节点的引用,以及自己处理不了,就交给下一个节点处理的方法。
- 节点类:继承节点父类。
- 客户端:一定要有一个建链的方法。
3.2 核心代码结构
就是节点父类的设计,用链表的思路去理解。