Java设计模式从精通到入门一 责任链模式

Wesley13
• 阅读 564

​ 一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了。于是有了想要记录下设计模式的笔记。打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一个更深刻的理解和流畅的表述。

介绍

​ 为请求创建了一个接受者的链,通常一个接收者包含下一个接受者的引用,如果该对象不能处理该请求,就传给下一个。依次类推,直到有处理的对象为止。

应用实例:jsp servlet的Filter,js中的事件冒泡

例子

​ 通过一个例子来深刻的认识他。以前古代女子都遵从着三从四德,三从:一从父亲,二从丈夫,三从儿子。

也就是在家听父亲的,嫁人后,听丈夫的,丧夫后,听儿子的。

​ 那么现在呢,人人平等,那么我就说以后吧,一步小心就是男子三从四德了,那么针对男子进行三从四德进行代码演练。一男子想买键盘,先从母亲开始问起,如果母亲不想理你 ,你就问你妻子,你妻子不理你,你就问你女儿,你女儿也不理,你就啥也不能买。

代码

  • 抽象未来男子人类

    /**

    • @ClassName Human
    • @Description 人类
    • @Author ouyangkang
    • @Date 2018-11-05 10:02

    / public abstract class Human { / * @Author ouyangkang * @Description 发起请求 * @Date 10:04 2018/11/5 * @param * @return void **/ public abstract void request();

    /**
     * @Author ouyangkang
     * @Description 获取请求的类型
     * @Date 10:05 2018/11/5
     * @param
     * @return java.lang.Integer
    **/
    public abstract Integer getType();
    

    }

  • 具体实现

    /**

    • @ClassName Man
    • @Description 未来男子
    • @Author ouyangkang
    • @Date 2018-11-05 10:07

    **/ public class Man extends Human {

    /**
     * @Date 2018/11/5 10:09
     * @Description 请求
     **/
    private String request;
    
    
    /**
     * @Date 2018/11/5 10:14
     * @Description 1 为入赘 2 已入赘 3 丧妻
     **/
    private Integer type ;
    
    @Override
    public void request() {
        System.out.println(request);
    }
    
    @Override
    public Integer getType() {
        return this.type;
    }
    
    
    public Man(String request, Integer type){
        this.request = request;
        this.type = type;
    }
    

    }

  • 处理抽象链

    /**

    • @ClassName Handler
    • @Description 责任链
    • @Author ouyangkang
    • @Date 2018-11-05 10:15

    **/ public abstract class Handler {

    public static final Integer MOTHER_LEVEL = 1;
    
    public static final Integer WIFE_LEVEL = 2;
    
    public  static final Integer DAUGHTER_LEVEL = 3;
    
    public  Integer level;
    
    /**
     * @Date 2018/11/5 10:16
     * @Description 下一个处理者
     **/
    private Handler nexHandler;
    
    public Handler(Integer level){
        this.level = level;
    }
    
    
    /**
     * @Author ouyangkang
     * @Description 处理信息
     * @Date 10:27 2018/11/5
     * @param human
     * @return void
    **/
    public void handleMessage(Human human){
        if (this.level.equals(human.getType())){
            this.response(human);
        }else {
            if (nexHandler != null){
                //传递给下一个处理对象
                this.nexHandler.handleMessage(human);
            }else {
                System.out.println("---------------");
                human.request();
                System.out.println("没有处理的人了");
            }
    
        }
    }
    
    /**
     * @Author ouyangkang
     * @Description 回复未来男子的请求
     * @Date 10:18 2018/11/5
     * @param
     * @return void
    **/
    public abstract void response(Human human);
    
    
    public void setNexHandler(Handler nexHandler){
        this.nexHandler = nexHandler;
    }
    

    }

  • 具体实现

    /**

    • @ClassName Mather
    • @Description 母亲
    • @Author ouyangkang
    • @Date 2018-11-05 10:28

    **/ public class Mather extends Handler {

    public Mather(){
        super(Handler.MOTHER_LEVEL);
    }
    
    @Override
    public void response(Human human) {
        System.out.println("-----------------");
        human.request();
        System.out.println("妈妈爱你 当然同意啦");
    }
    

    }

    /**

    • @ClassName Wife
    • @Description TODO
    • @Author ouyangkang
    • @Date 2018-11-05 10:46

    **/ public class Wife extends Handler {

    public Wife() {
        super(Handler.WIFE_LEVEL);
    }
    
    @Override
    public void response(Human human) {
        System.out.println("-----------------");
        human.request();
        System.out.println("");
    }
    

    }

    /**

    • @ClassName Wife
    • @Description TODO
    • @Author ouyangkang
    • @Date 2018-11-05 10:46

    **/ public class Wife extends Handler {

    public Wife() {
        super(Handler.WIFE_LEVEL);
    }
    
    @Override
    public void response(Human human) {
        System.out.println("-----------------");
        human.request();
        System.out.println("上次你那个机械键盘不是还能用吗 不给买");
    }
    

    }

    /**

    • @ClassName Daughter
    • @Description TODO
    • @Author ouyangkang
    • @Date 2018-11-05 10:48

    **/ public class Daughter extends Handler {

    public Daughter() {
        super(Handler.DAUGHTER_LEVEL);
    }
    
    @Override
    public void response(Human human) {
        System.out.println("-----------------");
        human.request();
        System.out.println("给糖吃就同意");
    }
    

    }

  • 客户端

    /**

    • @ClassName Main
    • @Description TODO
    • @Author ouyangkang
    • @Date 2018-11-05 10:49

    **/ public class Main { public static void main(String[] args) { Random random = new Random(); for (int i = 0 ;i < 5;i++){ Human human = new Man("我要买键盘", random.nextInt(4)); Handler mather = new Mather(); Handler wife = new Wife(); Handler daughter = new Daughter(); mather.setNexHandler(wife); wife.setNexHandler(daughter); mather.handleMessage(human);

        }
    
    }
    

    }

  • 返回结果


    我要买键盘

    给糖吃就同意

    我要买键盘

    上次你那个机械键盘不是还能用吗 不给买

    我要买键盘

    上次你那个机械键盘不是还能用吗 不给买

    我要买键盘

    妈妈爱你 当然同意啦

    我要买键盘 没有处理的人了

点赞
收藏
评论区
推荐文章
责任链和策略设计模式-基于Java编程语言
责任链和策略设计模式这两种设计模式非常实用,下面简单介绍一下我对这两种设计模式的理解和它们在Spring框架源码中的应用。
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
灯灯灯灯 灯灯灯灯
3年前
「超全超细」Java设计模式图文详解!!!
java设计模式—原型模式Java原型模式1、概述  啥是原型模式?  原型模式属于设计模式中的创建型中的一员,  原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象!  说大白话就是自己复制自己,通过原生对象复制出一个新的对象,这两个对象结构相同且相似;  需要注意的是,原型对象自己不仅是个对象还是个工厂!并且通过克隆方式创
Wesley13 Wesley13
3年前
java实现23种设计模式之责任链模式
顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。pa
一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队
责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加CodeReview的成本。
Stella981 Stella981
3年前
Apache commons chain 初探
Apachecommonschain是什么Apachecommonchain是对责任链设计模式的改造封装,让使用者更加方便的使用。简单回顾一下责任链设计模式在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(ChainofResponsibility)模式的:责任链模式是一种对象的行为模式。在
Wesley13 Wesley13
3年前
Java设计模式之责任链模式
引入责任链模式责任链模式顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会
Wesley13 Wesley13
3年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
一文带你读懂设计模式之责任链模式 | 京东云技术团队
翻了一下之前刚入职时候的学习笔记,发现之前在熟悉业务代码的时候曾经专门学习并整理过过设计模式中的责任链模式,之前只是对其简单了解过常用的设计模式有哪些,并未结合实例和源码深入对其探究,利用熟悉代码契机进行系统学习并整理文档如下。
京东云开发者 京东云开发者
3个月前
还在自己实现责任链?我建议你造轮子之前先看看这个开源项目
1.前言设计模式在软件开发中被广泛使用。通过使用设计模式,开发人员可以更加高效地开发出高质量的软件系统,提高代码的可读性、可维护性和可扩展性。责任链模式是一种常用的行为型设计模式,它将请求沿着处理链进行发送,直到其中一个处理者对请求进行处理为止。在责任链模