设计模式(十九)责任链模式

原创 2018年04月16日 23:32:54

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112

目录

导航

设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

前言

责任链模式:顾名思义,就是创建了一个的对象链来处理对象。这个模式对请求的发送者和接收者进行解耦。
处理抽象类(Handler):处理类的抽象父类,有指向下一个责任链成员的字段。
具体处理类(concreteHandler):具体的处理类,实现具体处理逻辑。
有很多地方需要用到责任链,一种是按等级来划分该谁来处理,比如你到店里吃饭,你发现桌子没有擦,所以你可以叫服务员来解决这个问题,不需要麻烦到经理和老板级别,但是假如你要投诉服务员,那么就得经理来处理这件事了,服务员是能力来处理的。这样实现的责任链,当任务处理完成后就结束了。
另一种实现方式是,每一个节点对象都有各自的功能,每一次请求都要走完全部的节点,我们的Filter便是这种类型的责任链,你可能有loginFilter来判断是否登录,encodeFilter来解决编码问题……等等

例子

LZ这里用服务员的场景来做例子

/***
 *
 *@Author ChenjunWang
 *@Description:处理抽象类
 *@Date: Created in 15:08 2018/4/16
 *@Modified By:
 *
 */
public abstract class Handler{

    private Handler next;//下一个处理的对象是谁

    //设置下一个处理对象,因为每一个处理对象都需要的方法,所以作为抽象类里的函数
    public void setNext(Handler next) {
        this.next = next;
    }
    public void next(Complain complain){
        next.handleComplain(complain);
    }

    abstract void handleComplain(Complain complain);
}


/***
 *
 *@Author ChenjunWang
 *@Description:具体处理服务员
 *@Date: Created in 15:08 2018/4/16
 *@Modified By:
 *
 */
public class Waiter extends Handler {
    @Override
    public void handleComplain(Complain complain) {

        if (complain.getLevel() == 3){
            System.out.println("3类投诉,服务员能处理");
        } else {
            System.out.println("服务员处理不了");
            next(complain);
        }
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:具体处理对象经理
 *@Date: Created in 15:09 2018/4/16
 *@Modified By:
 *
 */
public class Manager extends Handler {
    @Override
    public void handleComplain(Complain complain) {

        if (complain.getLevel() == 2){
            System.out.println("2类投诉,经理能处理");
        } else {
            System.out.println("经理处理不了");
            next(complain);
        }
    }


}

/***
 *
 *@Author ChenjunWang
 *@Description:具体处理对象老板
 *@Date: Created in 15:09 2018/4/16
 *@Modified By:
 *
 */
public class Boss extends Handler {
    @Override
    public void handleComplain(Complain complain) {

        if (complain.getLevel() == 1){
            System.out.println("1类投诉,老板能处理");
        } else {

            System.out.println("老板处理不了");
            System.out.println("无人能处理");
        }
    }
}



/***
 *
 *@Author ChenjunWang
 *@Description:要被处理的对象,这里是投诉类
 *@Date: Created in 17:38 2018/4/16
 *@Modified By:
 *
 */
public class Complain {
    private int level;//投诉的等级,处理对象靠这个字段来判断是否能处理
    private String content;
    public Complain(int level, String content){
        this.level = level;
        this.content = content;
    }

    public int getLevel() {
        return level;
    }

    public String getContent() {
        return content;
    }
}

/***
 *
 *@Author ChenjunWang
 *@Description:测试类
 *@Date: Created in 22:18 2018/4/16
 *@Modified By:
 *
 */
public class Test {
    public static void main(String[] args) {
        Boss boss = new Boss();
        Manager manager = new Manager();
        Waiter waiter = new Waiter();
        waiter.setNext(manager);
        manager.setNext(boss);

        System.out.println("-----------------三类投诉,桌子不干净-----------------");
        Complain complain = new Complain(3, "桌子不干净");
        waiter.handleComplain(complain);


        System.out.println("-----------------二类投诉,服务员态度不好-----------------");
        complain = new Complain(2, "我要投诉服务员");
        waiter.handleComplain(complain);
    }

}

运行结果如下
------------------------------------
-----------------三类投诉,桌子不干净-----------------
3类投诉,服务员能处理
-----------------二类投诉,服务员态度不好-----------------
服务员处理不了
2类投诉,经理能处理

责任往下,一层层传递,这就是责任链模式所起到的作用。非常的简单易懂。
filter的例子就不详细列举了
关键的地方是,先注册过滤器,即把filter假如责任链,设置Order可以改变责任链里执行的顺序,然后doFilter(request, response, chain);把请求传到下一个filter里进行处理。

总结

优点

(1)降低耦合度,它将请求的发送者和接收者解耦。
(2)对于使用者来说,责任链是黑箱,只需要调用第一个方法,后续任务,责任链会帮你解决。
(3)可以根据需要自由责任链内部结构。

缺点

(1)因为处理时以链的形式在对象间传递消息,递归调用会降低效率。

Git地址

本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/chainOfResponsibility

回到最上方


有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/niunai112/article/details/79968516

Javascript 设计模式之单例模式【专家辅导】

-
  • 1970年01月01日 08:00

java 跳一跳辅助实现源码

一个用JAVA实现的微信跳一跳辅助 使用方法 1.安装ADB工具。(若已安装请忽略,若未安装,windows平台可以使用adbTool目录下的platform-tools-latest-windo...
  • niunai112
  • niunai112
  • 2018-01-12 18:14:25
  • 2689

设计模式(八)桥接模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-03-24 23:42:39
  • 73

设计模式(九)外观模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-03-26 18:35:50
  • 55

设计模式(十七)状态模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-04-15 20:41:35
  • 54

设计模式(十六)命令模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-04-14 21:26:21
  • 42

spring源码学习(三)解析和注册BeanDefinition(上)

spring通过registerBeanDefinitions来解析和注册BeanDefinition。位于XmlDefinitionsReader类中 。...
  • niunai112
  • niunai112
  • 2017-08-25 14:17:22
  • 396

设计模式(一)单例模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 例子 Git地址 导航 设计...
  • niunai112
  • niunai112
  • 2018-03-14 00:14:00
  • 92

运用单例模式、建造者模式和策略模式实现异步加载Android联系人资料

学完设计模式很久了,最近又在看Android联系人提供程序的官方文档,于是就想实现一个方便的联系人管理程序demo,而联系人管理程序demo的核心就是要实现一个异步加载联系人资料的类,于是就有了下文。...
  • qq_28205153
  • qq_28205153
  • 2016-07-31 11:58:37
  • 620

设计模式(十八)访问者模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址...
  • niunai112
  • niunai112
  • 2018-04-16 00:05:22
  • 60
收藏助手
不良信息举报
您举报文章:设计模式(十九)责任链模式
举报原因:
原因补充:

(最多只允许输入30个字)