java设计模式(2)--责任链设计模式

文章目录

  • 1.什么是责任链设计模式
  • 2.责任链的应用场景
  • 4.责任链模式的代码演示

1.什么是责任链设计模式

定义
  创建多个对象,使这些对象形成一条链,并沿着这条链传递请求,直到链上的某一个对象决定处理此请求。

要点主要是:、

1、有多个对象共同对一个任务进行处理。
2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象
3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。
4、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。

大家可以理解为,公司的提交请假流程,首先我先进行条表单的填写,然后组长审批,其次告知人事,最后自己发送邮件告诉web组自己请假的事情。。 整个过程是有有流程的,顺序不能变,这就是责任链

2.责任链的应用场景

1.多条件流程判断 权限控制
2.ERP系统 流程审批 总经理、人事经理、项目经理
3.Java过滤器的底层实现Filter

比如:在Java过滤器中客户端发送请求到服务器端,过滤会经过参数过滤、session过滤、表单过滤、隐藏过滤、检测请求头过滤

4.责任链模式的代码演示

接下来有场景。程序员该需求和产品经理的争吵


public abstract class Handler {
    private Handler nextHandler;
    private int level;
    public Handler(int level) {
        this.level = level;
    }

    // 处理请求传递,注意final,子类不可重写
    public final void handleMessage(Demand demand) {
        if (level == demand.demandLevel()) {
            this.report(demand);
        } else {
            if (this.nextHandler != null) {
                System.out.println("事情太严重,需报告上一级");
                this.nextHandler.handleMessage(demand);
            } else {
                System.out.println("我就是boss,没有上头");
            }
        }
    }

    public void setNextHandler(Handler handler) {
        this.nextHandler = handler;
    }

    // 抽象方法,子类实现
    public abstract void report(Demand demand);
}

子类实现

// 技术经理
public class TechnicalManager extends Handler { //先找技术经理,他的权限为1
    public TechnicalManager() {
        super(1);
    }

    @Override
    public void report(Demand demand) {
        System.out.println("需求:" + demand.detail());
        System.out.println(getClass().getSimpleName() + ":小猿我挺你,这个需求不干");
    }
}

// boss
public class Boss extends Handler {  //找boos 他的权限为2
    public Boss() {
        super(2);
    }

    @Override
    public void report(Demand demand) {
        System.out.println("需求:" + demand.detail());
        System.out.println(getClass().getSimpleName() + ":你们打一架吧,打赢的做决定");
    }
}

最后的执行

public class FactoryHandler {

public class Client {
    public static void main(String[] args) {
        Demand demandA = new DemandA(); // 我要修改个方法A  (改动小)
        Demand demandB = new DemandB(); // 我要删库跑路(改动大)

        Boss boss = new Boss();  // 得到最高权限的人
        TechnicalManager technicalManager = new TechnicalManager();  // 得到技术经理
        technicalManager.setNextHandler(boss); // 设置下一级 //技术经理的上级是boos

        technicalManager.handleMessage(demandA);  //我来处理的改动
        System.out.println("============================");
        technicalManager.handleMessage(demandB);  //我来处理改动
    }
}

你可能感兴趣的:(设计模式)