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

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

介绍

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

应用实例: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 HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

责任链和策略设计模式-基于Java编程语言

责任链和策略设计模式这两种设计模式非常实用,下面简单介绍一下我对这两种设计模式的理解和它们在Spring框架源码中的应用。

java实现23种设计模式之责任链模式

顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。pa

一分钟学会、三分钟上手、五分钟应用,快速上手责任链框架详解 | 京东云技术团队

责任链模式是开发过程中常用的一种设计模式,在SpringMVC、Netty等许多框架中均有实现。我们日常的开发中如果要使用责任链模式,通常需要自己来实现,但自己临时实现的责任链既不通用,也很容易产生框架与业务代码耦合不清的问题,增加CodeReview的成本。

「超全超细」Java设计模式图文详解!!!

java设计模式—原型模式Java原型模式1、概述  啥是原型模式?  原型模式属于设计模式中的创建型中的一员,  原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象!  说大白话就是自己复制自己,通过原生对象复制出一个新的对象,这两个对象结构相同且相似;  需要注意的是,原型对象自己不仅是个对象还是个工厂!并且通过克隆方式创

Apache commons chain 初探

Apachecommonschain是什么Apachecommonchain是对责任链设计模式的改造封装,让使用者更加方便的使用。简单回顾一下责任链设计模式在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(ChainofResponsibility)模式的:责任链模式是一种对象的行为模式。在