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

介绍

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

应用实例: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设计模式从精通到入门一 责任链模式的更多相关文章

  1. Java 设计模式系列(二二)责任链模式

    Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...

  2. Java设计模式从精通到入门四 工厂方法模式

    工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 ​ 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...

  3. Java设计模式从精通到入门二 装饰器模式

    介绍 ​ 我尽量用最少的语言解释总结: ​ Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构. 应用实例: ​ 给英雄联盟种的射手,添加不同的装备.先装备攻速 ...

  4. Java设计模式(二十一):职责链模式

    职责链模式(Chain Of Responsibility Pattern) 职责链模式(Chain Of Responsibility Pattern):属于对象的行为模式.使多个对象都有机会处理请 ...

  5. 设计模式之(十四)责任链模式(Chain of Responsibility)

    在业务场景中,有很多是需要审批的.审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的. 责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系.讲这些对象连 ...

  6. 网络编程Netty入门:责任链模式介绍

    目录 责任链模式 责任链模式的简单实现 Netty中的ChannelPipeline责任链 服务端接收客户端连接 pipeline初始化 入站事件和出站事件 Pipeline中的Handler Pip ...

  7. 设计模式学习总结(十)责任链模式(Chain Of Responsibility)

    责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发!   一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...

  8. Java设计模式从精通到入门五 抽象工厂方法模式

    定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. ​ 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...

  9. Java设计模式从精通到入门三 策略模式

    介绍 我尽量用最少的语言解释总结: Java23种设计模式之一,属于行为型模式.一个类的行为或者算法可以在运行时更改,策略对象改变context对象执行算法. 应用实例: ​ 以周瑜赔了夫人又折兵的例 ...

随机推荐

  1. winform程序生成条形码并且并且保存到本地文件中。

    今天公司让做一个输入数字.字母生成条形码并且可以以图片格式保存到本地.当看到这个需求时候感觉很搞笑,明明可以用文本框搞定的东西非得做个程序.哎,寄人篱下,不多说了,这就是养兵千日用兵一时. 我在网上找 ...

  2. oracle分区分表

    (1) 表空间及分区表的概念表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.分区表:        当表中的数据量不断增大,查询数据的速 ...

  3. Java中利用Scanner键入的字符串与其他字符串的比较

    利用Scanner获取到键入的字符串与其他字符串作比较时,如果直接用关系运算符 == 比较,得到的结果总是false,因为实际比较的是两个变量引用的内存地址: 而要比较其内容是否相等,可以使用Obje ...

  4. 巧用CASE WHEN 验证用户登录信息

    最近逛博客园的时候偶然看到一个很巧妙的SQL,巧妙利用CASE WHEN 实现一个简单的 SQL 同时验证用户帐号是否存在.密码是否正确.晓菜鸟之前的做法都是根据用户名和密码一起验证,如果验证失败直接 ...

  5. MySQL中adddate学习

    -- 修改时间:ADDDATE(date,INTERVAL expr unit) -- 含义:date时间,expr 表达式值,unit表达式对应的时间单位 -- unit : SECOND,MINU ...

  6. CentOS----kdump failed

    启动提示:Starting kdump [failed] kdump 是一种先进的基于 kexec 的内核崩溃转储机制.当系统崩溃时,kdump 使用 kexec 启动到第二个内核.第二个内核通常叫做 ...

  7. OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  8. Java 企业级 JavaEE

    授权协议:CDDL 开发语言:Java 操作系统:跨平台 开发厂商:Oracle 原文:https://www.oschina.net/p/j2ee Java EE 详细介绍 这是SUN公司推出的J2 ...

  9. LeetCode(39):组合总和

    Medium! 题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates ...

  10. pyhon----模块导入

    正常情况 报错(两个导入都报错)