提出问题:

最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为了弄懂工作流程。

介绍:

看过很多介绍struts2的文章中,都详细的介绍了struts2的拦截器,struts2的拦截器是一个很好的结构,这个拦截器就是应用了责任链设计模式,很多用户的请求都会到这个拦截器中进行处理,我们事先不知道哪个地方会处理这个请求,先把请求传给责任链中的第一个处理者,如果第一个不能处理传给第二个,如果还不行就接着向后传递,直到这个请求被处理,责任链是一种链式结构,在业务处理中是一个很好的选择,事先我们不知道哪里会处理,把不同的业务放在这个链中,链中的每个处理者处理不同的请求,如果发现自己能处理就会处理,大家各司其职,互不干扰。

责任链模式最显著地特点就是,我们事先不知道哪里会处理掉这个请求,很多时候具有随机性,可能请求过来第一个就被处理掉了。

结构:

  • 抽象处理角色:在责任链模式中有一个抽象处理者(接口或者抽象类),规定了处理业务的方法,但是没有具体实现,同时还定义了一个对后面对象的引用,这样才可以组成一个链式结构(可以理解为指向下一个的指针)
  • 具体处理角色:还有一个就是具体的处理者,继承或者实现抽象处理者,给出抽象处理者的具体实现方法,注意具体的处理者可能有多个,所以还要有对下一个处理的引用,当本类无法处理的时候,传给下一个进行处理。

找了几本设计模式的书,上面的例子都是部门审批钱的,说设计模式怎么能没有例子呢?自己想了一个例子,关于学习的……小明有一道题不会,怎么办问学霸,学霸们也不都是万能的,哪道都会,有一个难度系数,学霸1只会难度系数5以下的,学霸2只会难度系数8以下的,而学霸3就厉害了,会的比前面两个都多,难度系数在10以下的都会。小明不能一开始就劳烦最厉害的学霸,一开始找学霸1,学霸1发现不会交给学霸2,当学霸2不会时交给学霸3……我们首先定义一个抽象的解决方法,当然这个类中定义了下面角色的引用。

抽象处理者:

package demo_zeren;

/**
* Created with IDEA
* author:DuzhenTong
* Date:2017/11/14
* Time:18:37
*/
public abstract class Handler {
/**
* 对下一个处理角色的引用
*/
public Handler handler = null; /**
* 获取下一个的引用
*
* @return
*/
public Handler getHandler() {
return handler;
} /**
* 设置下一个角色的引用
*
* @param handler
*/
public void setHandler(Handler handler) {
this.handler = handler;
} /**
* 处理问题的方法
* @param different 难度系数
* @return 结果
*/
public abstract String result(int different); }

具体处理角色1:学霸1

package demo_zeren;

/**
* 学霸1
* Created with IDEA
* author:DuzhenTong
* Date:2017/11/14
* Time:18:44
*/
public class SuperStudentOne extends Handler { /**
* 结果
*/
String result = ""; @Override
public String result( int different) {
//当问题难度系数是学霸1的范围时处理
if (different <= 2) {
result = "学霸1处理了难度系数为" + different + "的问题!";
} else {
//判断后面是否还有处理者,有交给后面,没有返回
if (getHandler() != null) {
return getHandler().result(different);
} else {
result = "问题太难了!";
}
}
return result;
}
}

具体处理角色2:学霸2

package demo_zeren;

/**
* 学霸2
* Created with IDEA
* author:DuzhenTong
* Date:2017/11/14
* Time:18:53
*/
public class SuperStudentTwo extends Handler {
//结果
String result = ""; //处理方法
@Override
public String result(int different) {
if (different <= 8) {
result = "学霸2处理了难度系数为" + different + "的问题!";
} else {
//判断后面是否还有处理者,有交给后面,没有返回
if (getHandler() != null) {
return getHandler().result(different);
} else {
result = "问题太难了!";
}
}
return result;
}
}

具体处理角色3:学霸3

package demo_zeren;

/**
* 学霸3
* Created with IDEA
* author:DuzhenTong
* Date:2017/11/14
* Time:18:55
*/
public class SuperStudentThree extends Handler {
//结果
String result = ""; //处理方法
@Override
public String result(int different) {
if (different <= 10) {
result = "学霸3处理了难度系数为" + different + "的问题!";
} else {
//判断后面是否还有处理者,有交给后面,没有返回
if (getHandler() != null) {
return getHandler().result(different);
} else {
result = "问题太难了!";
}
}
return result;
}
}

测试类:提供了4个难度系数的问题交给学霸们

package demo_zeren;

/**
* 测试类
* Created with IDEA
* author:DuzhenTong
* Date:2017/11/14
* Time:18:56
*/
public class Test {
public static void main(String[] args) {
/**
* 组建责任链
*/
SuperStudentOne s1 = new SuperStudentOne();
SuperStudentTwo s2 = new SuperStudentTwo();
SuperStudentThree s3 = new SuperStudentThree();
s1.setHandler(s2);
s2.setHandler(s3); String result1 = s1.result(9);
System.out.println(result1); String result2 = s1.result(6);
System.out.println(result2); String result3 = s1.result(2);
System.out.println(result3); //难度系数为12,超过最大处理的能力
String result4 = s1.result(12);
System.out.println(result4);
}
}

输出结果:

当然用户可以自己定义组成链的结构,一个或者两个角色:删去了学霸3这个处理角色,在组建链的结构中只有两个角色,还是刚才的问题测试输出:

        SuperStudentOne s1 = new SuperStudentOne();
SuperStudentTwo s2 = new SuperStudentTwo();
s1.setHandler(s2); String result1 = s1.result(9);
System.out.println(result1); String result2 = s1.result(6);
System.out.println(result2); String result3 = s1.result(2);
System.out.println(result3); //难度系数为12,超过最大处理的能力
String result4 = s1.result(12);
System.out.println(result4);

输出结果:

Java设计模式-责任链模式的更多相关文章

  1. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  2. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

  3. 我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  4. Java设计模式の责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  5. Java设计模式-责任链模式(Chain of Responsibility)

    接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...

  6. Java设计模式—责任链模式

    责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...

  7. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  8. Java与设计模式-责任链模式

    责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...

  9. php 23种设计模式 - 责任链模式

    责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...

随机推荐

  1. 微信小程序--TabBar不出现的一种原因

    转自 http://blog.csdn.net/yedouble/article/details/54089825 pages数组的第一项必须是tabBar的list数组的一员. quedian无法返 ...

  2. java 集合框架(三)Collection

    一.概述 Collection是集合框架的根接口.不同的集合具有不同的特性,比如有的集合可以有重复元素,有的不可以,有的可以排序,有的不可排序,如此等等,而Collection作为集合的根接口,它规范 ...

  3. Django2.0文档

    第四章 模板 1.标签 (1)if/else {% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在 {% if %} 和 {% e ...

  4. 【linux之挂载,Raid,LVM】

    一.挂载,卸载 挂载:将新的文件系统关联至当前根文件系统卸载:将某文件系统与当前根文件系统的关联关系移除 cat /etc/mtab 存储着已经挂载的文件系统 (跟 mount 一样) mount:显 ...

  5. php面向对象学习笔记01-面向对象介绍、构造函数、析构函数

    偶尔翻看以前的笔记.就整理下.方便以后的查阅 类-成员属性 成员属性是从某个事务提取出来的, 可以是基本数据类型,也可以是复合数据类型(数组,对象) //创建一个类 class Cat{ pubic ...

  6. freemarker报错之一

    freemarker 1.错误描述 java.io.FileNotFoundException: Template user.ftl not found. at freemarker.template ...

  7. raid功能中spanning和striping模式有什么区别?

    RAID 0 又称为Stripe(条带化,串列)或Striping 它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可 ...

  8. 芝麻HTTP: 1.9.3-Scrapyd-Client的安装

    在将Scrapy代码部署到远程Scrapyd的时候,第一步就是要将代码打包为EGG文件,其次需要将EGG文件上传到远程主机.这个过程如果用程序来实现,也是完全可以的,但是我们并不需要做这些工作,因为S ...

  9. UEFI模式 Thinkpad t470p Ubuntu 16.04 LTS

    准备阶段 使用官方推荐的Rufus制作U盘启动盘 在Windows 10系统下压缩出来一些空间(60G),不要分配盘符 系统设置 在Bios中关闭secure boot (设置为Disenabled) ...

  10. ASP.Net Core的Code Fist代码先行操作方法

    Asp.Net  core的Code Fist(代码先行)主要有以下几步: 1.创建实体类 2.创建数据库上下文 3.填加连接字符串 4.依赖注入 5.添加基架工具并执行初始迁移 6搭建模型的基本架构 ...