博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式-责任链模式
阅读量:7039 次
发布时间:2019-06-28

本文共 4600 字,大约阅读时间需要 15 分钟。

提出问题:

最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为了弄懂工作流程。

介绍:

看过很多介绍struts2的文章中,都详细的介绍了struts2的拦截器,struts2的拦截器是一个很好的结构,这个拦截器就是应用了责任链设计模式,很多用户的请求都会到这个拦截器中进行处理,我们事先不知道哪个地方会处理这个请求,先把请求传给责任链中的第一个处理者,如果第一个不能处理传给第二个,如果还不行就接着向后传递,直到这个请求被处理,责任链是一种链式结构,在业务处理中是一个很好的选择,事先我们不知道哪里会处理,把不同的业务放在这个链中,链中的每个处理者处理不同的请求,如果发现自己能处理就会处理,大家各司其职,互不干扰。

责任链模式最显著地特点就是,我们事先不知道哪里会处理掉这个请求,很多时候具有随机性,可能请求过来第一个就被处理掉了。

结构:

  • 抽象处理角色:在责任链模式中有一个抽象处理者(接口或者抽象类),规定了处理业务的方法,但是没有具体实现,同时还定义了一个对后面对象的引用,这样才可以组成一个链式结构(可以理解为指向下一个的指针)
  • 具体处理角色:还有一个就是具体的处理者,继承或者实现抽象处理者,给出抽象处理者的具体实现方法,注意具体的处理者可能有多个,所以还要有对下一个处理的引用,当本类无法处理的时候,传给下一个进行处理。

找了几本设计模式的书,上面的例子都是部门审批钱的,说设计模式怎么能没有例子呢?自己想了一个例子,关于学习的……小明有一道题不会,怎么办问学霸,学霸们也不都是万能的,哪道都会,有一个难度系数,学霸1只会难度系数5以下的,学霸2只会难度系数8以下的,而学霸3就厉害了,会的比前面两个都多,难度系数在10以下的都会。小明不能一开始就劳烦最厉害的学霸,一开始找学霸1,学霸1发现不会交给学霸2,当学霸2不会时交给学霸3……我们首先定义一个抽象的解决方法,当然这个类中定义了下面角色的引用。

抽象处理者:

package demo_zeren;/** * Created with IDEA * author:DuzhenTong * Date:2017/11/14 * Time:18:37 */public abstract class Handler {    /**     * 对下一个处理角色的引用     */    public Handler handler = null;    /**     * 获取下一个的引用     *     * @return     */    public Handler getHandler() {        return handler;    }    /**     * 设置下一个角色的引用     *     * @param handler     */    public void setHandler(Handler handler) {        this.handler = handler;    }    /**     * 处理问题的方法     * @param different 难度系数     * @return 结果     */    public abstract String result(int different);}
具体处理角色1:学霸1

package demo_zeren;/** * 学霸1 * Created with IDEA * author:DuzhenTong * Date:2017/11/14 * Time:18:44 */public class SuperStudentOne extends Handler {    /**     * 结果     */    String result = "";    @Override    public String result( int different) {        //当问题难度系数是学霸1的范围时处理        if (different <= 2) {            result = "学霸1处理了难度系数为" + different + "的问题!";        } else {            //判断后面是否还有处理者,有交给后面,没有返回            if (getHandler() != null) {                return getHandler().result(different);            } else {                result = "问题太难了!";            }        }        return result;    }}
具体处理角色2:学霸2

package demo_zeren;/** * 学霸2 * Created with IDEA * author:DuzhenTong * Date:2017/11/14 * Time:18:53 */public class SuperStudentTwo extends Handler {    //结果    String result = "";    //处理方法    @Override    public String result(int different) {        if (different <= 8) {            result = "学霸2处理了难度系数为" + different + "的问题!";        } else {            //判断后面是否还有处理者,有交给后面,没有返回            if (getHandler() != null) {                return getHandler().result(different);            } else {                result = "问题太难了!";            }        }        return result;    }}
具体处理角色3:学霸3

package demo_zeren;/** * 学霸3 * Created with IDEA * author:DuzhenTong * Date:2017/11/14 * Time:18:55 */public class SuperStudentThree extends Handler {    //结果    String result = "";    //处理方法    @Override    public String result(int different) {        if (different <= 10) {            result = "学霸3处理了难度系数为" + different + "的问题!";        } else {            //判断后面是否还有处理者,有交给后面,没有返回            if (getHandler() != null) {                return getHandler().result(different);            } else {                result = "问题太难了!";            }        }        return result;    }}
测试类:提供了4个难度系数的问题交给学霸们

package demo_zeren;/** * 测试类 * Created with IDEA * author:DuzhenTong * Date:2017/11/14 * Time:18:56 */public class Test {    public static void main(String[] args) {        /**         * 组建责任链         */        SuperStudentOne s1 = new SuperStudentOne();        SuperStudentTwo s2 = new SuperStudentTwo();        SuperStudentThree s3 = new SuperStudentThree();        s1.setHandler(s2);        s2.setHandler(s3);        String result1 = s1.result(9);        System.out.println(result1);        String result2 = s1.result(6);        System.out.println(result2);        String result3 = s1.result(2);        System.out.println(result3);        //难度系数为12,超过最大处理的能力        String result4 = s1.result(12);        System.out.println(result4);    }}
输出结果:

当然用户可以自己定义组成链的结构,一个或者两个角色:删去了学霸3这个处理角色,在组建链的结构中只有两个角色,还是刚才的问题测试输出:

SuperStudentOne s1 = new SuperStudentOne();        SuperStudentTwo s2 = new SuperStudentTwo();        s1.setHandler(s2);        String result1 = s1.result(9);        System.out.println(result1);        String result2 = s1.result(6);        System.out.println(result2);        String result3 = s1.result(2);        System.out.println(result3);        //难度系数为12,超过最大处理的能力        String result4 = s1.result(12);        System.out.println(result4);
输出结果:

转载于:https://www.cnblogs.com/duzhentong/p/8576526.html

你可能感兴趣的文章
传入参数方法,参数值变化
查看>>
Mongodb Sharding Cluster 三台
查看>>
Spring boot with Oracle
查看>>
Android设计模式系列(10)--SDK源码之原型模式
查看>>
对象的共享
查看>>
android在线API地址
查看>>
Verson Magic problem
查看>>
Passcode
查看>>
TapKu Graph
查看>>
面试需要的基础知识-合并排序数组
查看>>
关于Unity 2018的实体组件系统(ECS)一
查看>>
Echarts---添加渐变功能
查看>>
linux 下解压命令大全
查看>>
深入了解 Linux下安装DNS+Sendmail服务
查看>>
python在类中实现swith case功能
查看>>
Maven com.sun.jdmk:jmxtools:jar 下载不下来
查看>>
DevExpress之Skin自定义使用
查看>>
可变参数
查看>>
[日推荐]『饿了么外卖服务』饿了么官方小程序,无需下载安装!
查看>>
JavaScript 作用域
查看>>