概念
责任链就是用于处理相关事务的一条链,链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就依次传递给下一个节点,直到处理完毕。
实现方式:
举例:其中一条车往右行驶,在马路上会有测速摄像头(红色),违章摄像头(橙色),测速摄像头就是对汽车的行驶速度是否为安全速度进行评判,而违章摄像头则是对汽车驾驶员是否系上安全带进行评判,这里测速摄像头和违章摄像头组成一条处理事务的链,而这两个摄像头就好比是链上的节点,用于处理事务的。
实现代码:
定义一个汽车,包含速度,安全带是否系上两个属性:
public class Car {
//表示速度
private int speed;
//表示是否系上安全带,0:没系; 1:系上了
private int save;
public Car(int speed, int save) {
this.speed = speed;
this.save = save;
}
@Override
public String toString() {
return "Car{" +
"speed=" + speed +
", save=" + save +
'}';
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getSave() {
return save;
}
public void setSave(int save) {
this.save = save;
}
}
定义摄像头的接口,及其方法名:
public interface Photo {
//拍摄功能
public boolean take(Car car);
}
定义测速摄像头
public class CeSu implements Photo {
@Override
public boolean take(Car car) {
//判断是否超速
if(car.getSpeed() > 60){
System.out.println("已经超速");
return false;
}
System.out.println("速度安全,安全通过!");
return true;
}
}
定义违章摄像头:
public class WeiZhang implements Photo {
@Override
public boolean take(Car car) {
//判断是否系安全带
if(car.getSave() == 0){
System.out.println("没有佩戴安全带");
return false;
}
System.out.println("已经佩戴安全带,安全通过!");
return true;
}
}
定义一条链,用于存放马路上所有摄像头:
public class Chain {
//声明一个链用于存储路上所有摄像头
List<Photo> list = new ArrayList<>();
//设置添加方法
public void add(Photo photo){
list.add(photo);
}
//遍历每个摄像头,进行事务的处理
public boolean take(Car c){
for(Photo photo : list){
//如果任意一个摄像头无法通过,则无法向下进行了
if(!photo.take(c))
return false;
}
return true;
}
}
测试:
public class Road {
public static void main(String[] args) {
//声明一个汽车
Car car = new Car(100,1);
//声明一条链,用于存放摄像头
Chain chain = new Chain();
//添加测速摄像头
chain.add(new CeSu());
//添加违章摄像头
chain.add(new WeiZhang());
//执行相关事务
chain.take(car);
}
}
测试结果:
场景升级:这辆车在马路尽头掉头往回走,往回走的时候经过的摄像头顺序与来的时候相反,往回走的时候先经过违章,再经过测速,如图所示:
实现代码如下:
修改摄像头接口:
public interface Photo {
//拍摄功能
public boolean take(Car car,Chain chain);
}
定义测速摄像头:
public class CeSu implements Photo {
@Override
public boolean take(Car car,Chain chain) {
//判断是否超速
if(car.getSpeed() > 60){
System.out.println("已经超速");
return false;
}
System.out.println("速度安全,安全通过!");
//往后执行
chain.take(car,chain);
System.out.println("经过测速摄像头!");
return true;
}
}
定义违章摄像头:
public class WeiZhang implements Photo {
@Override
public boolean take(Car car,Chain chain) {
//判断是否系安全带
if(car.getSave() == 0){
System.out.println("没有佩戴安全带");
return false;
}
System.out.println("已经佩戴安全带,安全通过!");
//往后执行
chain.take(car,chain);
System.out.println("经过违章摄像头!");
return true;
}
}
定义摄像头链:
public class Chain {
//声明一个链用于存储路上所有摄像头
List<Photo> list = new ArrayList<>();
//用于记录当前执行的位置
int index = 0;
//设置添加方法
public void add(Photo photo){
list.add(photo);
}
//遍历每个摄像头,进行事务的处理
public boolean take(Car c,Chain chain){
//遍历到最后一个摄像头,结束
if(index == list.size()){
return false;
}
//获取当前经过摄像头
Photo photo = list.get(index);
//位置标志往后移
index++;
//返回当前摄像头执行事务
return photo.take(c,chain);
}
}
测试:
public class Road {
public static void main(String[] args) {
//声明一个汽车
Car car = new Car(40,1);
//声明一条链,用于存放摄像头
Chain chain = new Chain();
//添加测速摄像头
chain.add(new CeSu());
//添加违章摄像头
chain.add(new WeiZhang());
//执行相关事务
chain.take(car,chain);
}
}
实验结果:
优点:低耦合,不同的类只需要处理自己该处理的工作,无法处理的事情转交给下一个类,如果其中一个类没通过,则不往下执行,每个类只用负责自己的工作就行,容易维护。
缺点:使用链式进行每个处理事务类的存储,如果存储数量大,需要从头到尾进行遍历,效率比较低。
本文的代码:https://pan.baidu.com/s/1Knnfd3rQ82bytYDm_Kna4Q
提取码:nvfn