什么是责任链模式?

责任链模式(Chain of Responsibility Pattern):请求知道公开接口,但不知道那个具体类处理,这些具体处理类对象连接成一条链。请求沿着这条链传递,直到有对象处理它为止。

解决什么问题?

职责链将请求的发送者和请求的处理者解耦,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递。

处理原则 "如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。"

场景应用

以医院看病为例

病人类

 /**
* 病人
*/
public class Patient {
//病人名字
String name ;
//病人年龄
int age;
//病例描述
String describe;
//病人状态
String state; public String getState() {
return state;
} public void setState(String state) {
this.state = state;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getDescribe() {
return describe;
} public void setDescribe(String describe) {
this.describe = describe;
}
}

Patient.java

医院类

 import java.util.ArrayList;
import java.util.List; /**
* 医院
*/
public class Hospital { /**
* 病人
*/
private Patient patient; /**
* 责任链
*/
public List<Department> chain = new ArrayList<>(); public Hospital() {
InitDepartmentChain();
} /**
* 初始化科室
*/
private void InitDepartmentChain() {
HeadDepartment head = new HeadDepartment();
chain.add(head);
HandDepartment hand = new HandDepartment();
chain.add(hand);
FootDepartment foot = new FootDepartment();
chain.add(foot);
} /**
* 接收病人
*
* @param p 病人
*/
public void receivePatien(Patient p) {
this.patient = p;
this.patient=treatment();
if ("痊愈".equals(this.patient.state)){
System.out.println("恭喜病人已经痊愈!可以出院了!!!");
}else{
System.out.println("sorry!本医院无法治疗该疑难杂症,请转到别的医院!");
}
} /**
* 治疗病人
*
* @return 病人
*/
public Patient treatment() {
for (Department department : chain) {
patient =department.receivePatient(patient);
if("痊愈".equals(patient.state))
break;
}
return patient;
}
}

Hospital.java

医院科室基类

 /**
* 科室
*/
public abstract class Department { //科室名称
String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} //职能
String duty; public String getDuty() {
return duty;
} public void setDuty(String duty) {
this.duty = duty;
} //病人
Patient patient; public Patient receivePatient(Patient p) {
System.out.println("欢迎来到科室:" + this.name);
this.patient = p;
return treatment();
} //判断是否是科室范畴病人
private boolean isMyPatient() {
return this.patient != null && this.patient.describe.equals(duty);
} private Patient treatment() {
if (isMyPatient()) {
System.out.println("科室[" + this.name + "]接收了病人");
System.out.println("病人资料\n\t" + "名字:" + this.patient.name + "\n\t年龄:" + this.patient.age + "\n\t病例:" + this.patient.describe);
System.out.println("开始治疗病人。。。。。");
this.patient.state = "痊愈";
System.out.println("病人已经医治好");
} else {
System.out.println("sorry,不是科室[" + this.name + "]的范畴,请到别的科室诊治!");
} return this.patient;
} }

Department.java

头部科室类

 /**
* 头部门诊
*/
public class HeadDepartment extends Department { public HeadDepartment(){
this.setName("头部门诊");
this.setDuty("头痛");
}
}

HeadDepartment.java

手部科室类

 /**
* 手科室
*/
public class HandDepartment extends Department {
public HandDepartment(){
this.setName("手部科室");
this.setDuty("手痛");
}
}

HandDepartment.java

脚部科室类

 /**
* 脚部科室
*/
public class FootDepartment extends Department {
public FootDepartment(){
this.setName("脚部科室");
this.setDuty("脚痛");
}
}

FootDepartment.java

main方法

 public class App {
public static void main(String[] args) {
Hospital hospital = new Hospital();
Patient patient = new Patient();
patient.setName("王五");
patient.setAge(12);
patient.setDescribe("手痛");
patient.setState("生病了");
hospital.receivePatien(patient);
}
}

main方法

输出结果

欢迎来到科室:头部门诊
sorry,不是科室[头部门诊]的范畴,请到别的科室诊治!
欢迎来到科室:手部科室
科室[手部科室]接收了病人
病人资料
名字:王五
年龄:12
病例:手痛
开始治疗病人。。。。。
病人已经医治好
恭喜病人已经痊愈!可以出院了!!!

总结

(1)消息处理者有多个,他们构成一条责任链,请求只管把请求发送到责任链上,却不关心处理细节和处理传递。

(2)沿着这条链传递请求,直到有对象处理它为止或整条责任链传递完成。

实例源码:https://github.com/LF20160912/pattern

设计模式Design Pattern(3) -- 责任链模式的更多相关文章

  1. Java设计模式(14)责任链模式(Chain of Responsibility模式)

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

  2. php设计模式课程---5、责任链模式是什么

    php设计模式课程---5.责任链模式是什么 一.总结 一句话总结: 自己权限不够,就交给上级处理 1.选择结构怎么做到面向对象开闭原则? 也就是说if,都可以用接口的实现来实现,这样就避免了更新的时 ...

  3. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...

  4. 设计模式-(15)责任链模式 (swift版)

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

  5. 【PHP设计模式 07_ZeRenLian.php】责任链模式

    <?php /** * [责任链模式] * 情景设置:根据不同的需求,去找相应级别的责任人解决问题 */ header("Content-type: text/html; charse ...

  6. 【设计模式 - 13】之责任链模式(Chain Of Responsibility)

    1      模式简介 责任链模式的简介: 1.        责任链模式为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一 ...

  7. Java设计模式(九)责任链模式 命令模式

    (十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...

  8. java23种设计模式之十:责任链模式

    最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式. 一.什么样的场景下会选择用责任链模式 我们在进行业务逻辑判断时,需 ...

  9. java设计模式(五)责任链模式

    很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上某个对象决定处理此请求,应用场景如单位审批流程等. 要点:1)抽象处理者角色:定义处理请求接口及设定下家引用    2 ...

随机推荐

  1. 终于, Delphi XE2 携带 GDI+ 库了

    终于, Delphi XE2 携带 GDI+ 库了 使用了较早的 http://www.progdigy.com uses Winapi.GDIPAPI, Winapi.GDIPOBJ{, Winap ...

  2. robot framework UI自动化之登录

    前面已写环境的搭建,接下来就可以直接进行UI自动化的编写工作了 目录 1.准备工作 2.了解定位 3.一个登录案例 1.准备工作 第一步:需要使用chrome浏览器来测试,因此首先要有一个驱动,下载好 ...

  3. js监听当前页面再次加载

    document.addEventListener("visibilitychange", function () { if (!document.hidden) { //处于当前 ...

  4. maven scope provided和runtime的例子

    maven常用的scope有compile,provided,runtime,test. complie是默认值,表示在build,test,runtime阶段的classpath下都有依赖关系.te ...

  5. tensorflow学习之Saver保存读取

    目前不是很懂..但主要意思是tf可以把一开始定义的参数,包括Weights和Biases保存到本地,然后再定义一个变量框架去加载(restore)这个参数,作为变量本身的参数进行后续的训练,具体如下: ...

  6. API接口设计

    1.场景描述 比如说我们要做一款APP,需要通过api接口给app提供数据.假设我们是做商城,比如我们卖书的.我们可以想象下这个APP大概有哪些内容: 1)首页:banner区域(可以是一些热门书籍的 ...

  7. java8--- (Function、Predicate、Consumer) 通用函数式接口

    // public static void main(String[] args) throws InterruptedException { // https://blog.csdn.net/u01 ...

  8. vue element 导出 分页数据的excel表格

    1.安装相关依赖 npm install --save xlsx file-saver 2.导入相关插件 在组建头部导入相关插件 const FileSaver = require("fil ...

  9. Thinkphp3.2 Redis支持REDIS_AUTH验证

    原有的Redis类在Library/Think/Cache/Driver/中 换成下面的: <?php // +----------------------------------------- ...

  10. Centos7 yum安装LNMP

    1.Centos7系统库中默认是没有nginx的rpn包的,所以我们需要先更新下rpm依赖库 (1):使用yum安装nginx,安装nginx库 rpm -Uvh http://nginx.org/p ...