• 《JAVA设计模式系列》责任链模式


    责任链模式

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

    责任链模式优缺点

    优点

    • 降低耦合度。它将请求的发送者和接收者解耦。

    • 简化了对象。使得对象不需要知道链的结构。

    • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

    • 增加新的请求处理类很方便。

    缺点

    • 不能保证请求一定被接收。

    • 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

    • 可能不容易观察运行时的特征,有碍于除错。

    应用场景

    • 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

    • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

    • 可动态指定一组对象处理请求。

    责任链模式的结构

    • 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

    • 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

    • 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

    实现流程

    抽象处理者(Handler)角色

    public interface BudgetHandler {
        void setNextHandler(BudgetHandler nextHandler);
        boolean handle(int amount);
    }
    
    • 1
    • 2
    • 3
    • 4

    具体处理者(Concrete Handler)角色

    
    public class CFO implements BudgetHandler{
        private BudgetHandler nextHandler;
    
        @Override
        public void setNextHandler(BudgetHandler nextHandler) {
            this.nextHandler = nextHandler;
        }
    
        @Override
        public boolean handle(int amount) {
            if(amount<50000){
                System.out.println("CFO同意,希望你再接再厉,为公司做出更大的贡献。");
                return true;
            }
            if (nextHandler!=null){
                return nextHandler.handle(amount);
            }
            //已经没有更高级的管理层来处理了
            System.out.println(String.format("%d太多了,回去好好看看能不能缩减一下",amount));
            return false;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    具体处理者(Concrete Handler)角色

    public class Manager implements BudgetHandler{
    
        private BudgetHandler nextHandler;
        @Override
        public void setNextHandler(BudgetHandler nextHandler) {
            this.nextHandler = nextHandler;
        }
    
        @Override
        public boolean handle(int amount) {
            Objects.requireNonNull(nextHandler);
    
            if (amount<5000){
                System.out.println("小于5000块,我这个经理可以决定:同意");
                return true;
            }
            System.out.println(String.format("%d超出Manager权限,请更高级管理层批复",amount));
            return nextHandler.handle(amount);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    具体处理者(Concrete Handler)角色

    public class GroupLeader implements BudgetHandler{
    
        private BudgetHandler nextHandler;
    
        @Override
        public void setNextHandler(BudgetHandler nextHandler) {
            this.nextHandler = nextHandler;
        }
    
        @Override
        public boolean handle(int amount) {
            Objects.requireNonNull(nextHandler);
            if (amount<1000){
                System.out.println("小钱 批了");
            }
            System.out.println(String.format("%d超出GroupLeader权限,请更高级管理层批复",amount));
            return nextHandler.handle(amount);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    客户端

    public class DogWang2Cor {
        public static void main(String[] args) {
            applyBudget();
        }
        public static void applyBudget(){
            
            GroupLeader leader = new GroupLeader();
            Manager manager = new Manager();
            CFO cfo = new CFO();
            leader.setNextHandler(manager);
            manager.setNextHandler(cfo);
    
            System.out.println(String.format("领导您好:需要购买一台Mac笔记本电脑,预算为%d 望领导批准", 95000));
    
            if (leader.handle(1000)) {
                System.out.println("谢谢领导");
            } else {
                System.out.println("巧妇难为无米之炊,只能划船了...");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    给文件添加可读可写可执行权限
    [附源码]Python计算机毕业设计《数据库系统原理》在线学习平台
    Java多线程(2)
    java EE初阶 — 计算机工作原理
    Android Compose 文本输入框TextField使用详解
    unity工程参照以及评价
    Cglib
    vue2的双向绑定
    三分钟使用ngrok实现内网穿透
    1024 向所有的程序员们致以崇高的敬意和感谢
  • 原文地址:https://blog.csdn.net/qq_29917503/article/details/126906834