小白谈谈责任链模式

概念

责任链就是用于处理相关事务的一条链,链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就依次传递给下一个节点,直到处理完毕。

实现方式:

举例:其中一条车往右行驶,在马路上会有测速摄像头(红色),违章摄像头(橙色),测速摄像头就是对汽车的行驶速度是否为安全速度进行评判,而违章摄像头则是对汽车驾驶员是否系上安全带进行评判,这里测速摄像头和违章摄像头组成一条处理事务的链,而这两个摄像头就好比是链上的节点,用于处理事务的。
在这里插入图片描述
实现代码:
定义一个汽车,包含速度,安全带是否系上两个属性:

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;
    }

}

定义违章摄像头:

扫描二维码关注公众号,回复: 10592321 查看本文章
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

发布了48 篇原创文章 · 获赞 0 · 访问量 664

猜你喜欢

转载自blog.csdn.net/weixin_44943485/article/details/105220157
今日推荐