设计模式之责任链模式

目录

1.责任链概念

2.责任链组成

3.举个栗子:

4.代码实现

1)抽象处理者

2)具体处理者

        老师

导员

校长

3)客户端类

5.运行结果

附录:

1)23种设计模式讲解地址

2)23种设计模式源码下载地址:


1.责任链概念

        允许请求沿着处理者链传递,直到链上的某个处理者决定处理此请求。通过这种方式,请求的发送者无须知道是哪一个接收者处理其请求,这使得系统可以动态地重新组织和分配责任。

2.责任链组成

        抽象处理者(Handler): 定义一个处理请求的接口,并持有下一个处理者的引用。

        具体处理者(Concrete Handlers): 实现抽象处理者的接口,在处理请求前判断自己是否能够处理该请求,如果可以则进行处理,否则将请求传递给下一个处理者。

        客户端(Client): 创建处理者链并将请求发送到链的第一个节点。

3.举个栗子:

以学生请假为例

7天        正常流程:老师(小于2天)==>领导(7天以下)===>校长(所有都行)    结果==》导员批

7天        非正常流程(导员有事): 老师(小于2天)===>校长(所有都行)              结果==》校长批

15天       正常流程:老师(小于2天)==>领导(7天以下)===>校长(所有都行)   结果==》校长批

主要部分:

  1. 老师:这是第一个处理请求的对象,如果请求可以处理,则处理请求,否则将请求传递给下一个对象。
  2. 导员:这是第二个处理请求的对象,如果请求可以处理,则处理请求,否则将请求传递给下一个对象。
  3. 校长:这是最后一个处理请求的对象,如果请求可以处理,则处理请求,否则请求将被拒绝。

通过这种方式,责任链模式允许将请求沿着一个链传递,直到有对象处理该请求为止。

4.代码实现

1)抽象处理者

        这段代码定义了一个责任链模式中的抽象处理者类 Handler。
                类定义
                        Handler 是一个抽象类,用于定义责任链中的处理者。


                成员变量
                        protected Handler nextHandler:表示下一个处理者。


                设置下一个处理者
                        public Handler setNextHandler(Handler nextHandler):设置当前处理者的下一个处理者,并返回下一个处理者。


                处理方法
                        public abstract void handle(int day):定义一个抽象方法 handle,用于处理请求。

package org.xiji.ChainOfResponsibility;

/**
 * 抽象处理者
 */
public abstract class Handler {
    /**
     * 下一个处理者
     */
    protected Handler nextHandler;

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

    /**
     * 定义处理方法
     */
    public abstract void handle(int day);



}

2)具体处理者

        老师

                这段代码定义了一个责任链模式中的具体处理者类 Teacher,继承自抽象处理者类 Handler。


                类定义
                        Teacher 类继承自抽象处理者类 Handler。


                处理方法
                        public void handle(int day):重写了从 Handler 抽象类继承来的 handle 方法。
                        如果请假天数 day 小于等于 2 天,则由老师批准。
                        否则,将请求传递给下一个处理者。

package org.xiji.ChainOfResponsibility;

/**
 * 老师
 */
public class Teacher extends Handler{
    @Override
    public void handle(int day) {
        if (day <= 2) {
            System.out.println("老师批注请假"+day+"天");
        }else {
            nextHandler.handle(day);
        }

    }
}

导员

        这段代码定义了一个责任链模式中的具体处理者类 Instructor,继承自抽象处理者类 Handler。


                类定义
                        Instructor 类继承自抽象处理者类 Handler。


                处理方法
                        public void handle(int day):重写了从 Handler 抽象类继承来的 handle 方法。
                        如果请假天数 day 小于等于 7 天,则由导员批准。
                        否则,将请求传递给下一个处理者。

package org.xiji.ChainOfResponsibility;

/**
 * 导员
 */
public class Instructor extends Handler{
    @Override
    public void handle(int day) {
        if (day <= 7) {
            System.out.println("导员批注请假"+day+"天");
        } else {
            nextHandler.handle(day);
        }
    }
}

校长

        这段代码定义了一个责任链模式中的具体处理者类 Principal,继承自抽象处理者类 Handler。


                类定义
                        Principal 类继承自抽象处理者类 Handler。


                处理方法
                        public void handle(int day):重写了从 Handler 抽象类继承来的 handle 方法。
                        不论请假天数是多少,均由校长批准

package org.xiji.ChainOfResponsibility;

/**
 * 校长
 */
public class Principal extends Handler{
    @Override
    public void handle(int day) {
        System.out.println("校长批注请假"+day+"天");
    }
}

3)客户端类

        这段代码定义了一个责任链模式的测试类 ChainOfResponsibilityMain,展示了如何使用责任链模式处理请假请求。
                
                初始化对象
                        创建 Teacher、Instructor 和 Principal 对象。
                设置责任链
                设置责任链关系:
                        teacher.setNextHandler(instructor);:老师处理完后交给导员。
                        instructor.setNextHandler(principal);:导员处理完后交给校长。
                处理请假请求
                        正常流程请7天假
                                请假关系:老师 → 导员 → 校长
                                输出结果:导员批准请假7天。
                非正常流程请7天假
                        请假关系:老师 → 校长
                        输出结果:校长批准请假7天。
                        正常流程请15天假
                请假关系:老师 → 导员 → 校长
                        输出结果:校长批准请假15天。

package org.xiji.ChainOfResponsibility;

/**
 * 处理器测试类
 */
public class ChainOfResponsibilityMain {
    public static void main(String[] args) {
        //老师角色
        Teacher teacher = new Teacher();

        //导员角色
        Instructor instructor = new Instructor();

        //校长角色
        Principal principal = new Principal();

        System.out.println("===========================");
        /**
         * 请假关系   老师==>导员===>校长
         */
        System.out.println("正常流程请7天假");
        teacher.setNextHandler(instructor);
        instructor.setNextHandler(principal);
        //例如找老师请假七天
        int day = 7;
        teacher.handle(day);

        System.out.println("===========================");
        System.out.println("非正常流程请7天假");
        //找老师请假七天,导员不在,老师让你找校长
        /**
         * 请假关系 老师===>校长
         */
        teacher.setNextHandler(principal);
        teacher.handle(day);
        System.out.println("===========================");
        System.out.println("正常流程请15天假");
        //想请15天假
        int day2 = 15;
        //正常流程 找老师请假===>导员===>校长
        teacher.setNextHandler(instructor);
        instructor.setNextHandler(principal);
        teacher.handle(day2);

    }
}

5.运行结果

附录:

1)23种设计模式讲解地址

23种设计模式讲解地址

专题地址:https://blog.csdn.net/2301_76862031/category_12779841.html


 设计模式之访问者模式地址:  https://blog.csdn.net/2301_76862031/article/details/141716629

 设计模式之简单工厂模式地址: https://blog.csdn.net/2301_76862031/article/details/141641161
 设计模式之策略模式工厂地址:https://blog.csdn.net/2301_76862031/article/details/141647304

设计模式之备忘录模式地址:     https://blog.csdn.net/2301_76862031/article/details/141678153
 
 设计模式之代理模式: https://blog.csdn.net/2301_76862031/article/details/141681834
 
 设计模式之单例模式: https://blog.csdn.net/2301_76862031/article/details/141684340
 
 设计模式之迭代器模式: https://blog.csdn.net/2301_76862031/article/details/141690379
 
 设计模式之观察者模式:https://blog.csdn.net/2301_76862031/article/details/141723684
 
 设计模式之命令模式: https://blog.csdn.net/2301_76862031/article/details/141728371
 
 设计模式之模板方法模式: https://blog.csdn.net/2301_76862031/article/details/141729898
 
 设计模式之桥接模式: https://blog.csdn.net/2301_76862031/article/details/141748997
 
 设计模式之适配器模式: https://blog.csdn.net/2301_76862031/article/details/141752130
 
 设计模式之外观模式: https://blog.csdn.net/2301_76862031/article/details/141753019

设计模式之享元模式: https://blog.csdn.net/2301_76862031/article/details/141755905
 
 设计模式之原型模式: https://blog.csdn.net/2301_76862031/article/details/141759296
 
 设计模式之责任链模式: https://blog.csdn.net/2301_76862031/article/details/141760704

 设计模式之中介模式: https://blog.csdn.net/2301_76862031/article/details/141777728
 
 设计模式之装饰者模式: https://blog.csdn.net/2301_76862031/article/details/141784167
 
 设计模式之状态模式: https://blog.csdn.net/2301_76862031/article/details/141786766
 
 设计模式之组合模式: https://blog.csdn.net/2301_76862031/article/details/141787708
 
 设计模式之工厂方法模式: https://blog.csdn.net/2301_76862031/article/details/141826862
 
 设计模式之解释器模式: https://blog.csdn.net/2301_76862031/article/details/141859953
 

2)23种设计模式源码下载地址:

java23种设计模式的实现代码(): 23种设计模式的实现使用java,并且均已经通过测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值