阅读 58

java责任链模式

定义

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

下载.png

责任链模式涉及到的角色如下所示:
抽象处理者角色:定义了处理请求的接口或者抽象类,提供了处理请求的的方法和设置下一个处理者的方法。
具体处理者角色:实现或者继承抽象这角色,具体逻辑根据实际的架构来定,后面会提到。

实战

抽象处理者角色代码:

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);
}
复制代码

具体处理者角色,继承抽象处理者角色,在我们情景中有两个具体处理者,分别是技术经理和boss。

// 技术经理
public class TechnicalManager extends Handler {
    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 {
    public Boss() {
        super(2);
    }

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

客户端

public class Client {
    public static void main(String[] args) {
        Demand demandA = new DemandA(); // 请求等级低
        Demand demandB = new DemandB(); // 请求等级高

        Boss boss = new Boss();
        TechnicalManager technicalManager = new TechnicalManager();
        technicalManager.setNextHandler(boss); // 设置下一级

        technicalManager.handleMessage(demandA);
        System.out.println("============================");
        technicalManager.handleMessage(demandB);
    }
}
复制代码

参考

segmentfault.com/a/119000001…

文章分类
后端
文章标签