德赢vwin官网
  咨询电话:13983068312

vwin德赢手机网

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); } }}返回结果

-----------------我要买键盘给糖吃就同意-----------------我要买键盘上次你那个机械键盘不是还能用吗 不给买-----------------我要买键盘上次你那个机械键盘不是还能用吗 不给买-----------------我要买键盘妈妈爱你 当然同意啦---------------我要买键盘没有处理的人了