什么是责任链模式?

责任链模式(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. App测试工具选择

    一.功能测试自动化 a) 轻量接口自动化测试: jmeter, b) APP UI层面的自动化 android:UI Automator Viewer,Android Junit,Instrument ...

  2. Spring源码入门——DefaultBeanNameGenerator解析 转发 https://www.cnblogs.com/jason0529/p/5272265.html

    Spring源码入门——DefaultBeanNameGenerator解析   我们知道在spring中每个bean都要有一个id或者name标示每个唯一的bean,在xml中定义一个bean可以指 ...

  3. ElasticSearch入门 —— 集群搭建

    一.环境介绍与安装准备 1.环境说明 2台虚拟机,OS为ubuntu13.04,ip分别为xxx.xxx.xxx.140和xxx.xxx.xxx.145. 2.安装准备 ElasticSearch(简 ...

  4. Django-DRF组件学习-预备知识

    1.web开发应用模式 在开发Web应用中,有两种应用模式: 1.1 前后端不分离 所谓的前后端不分离,就是前后端数据都在同一个服务器中,前端的样式以及页面渲染都由后端一次性渲染出来在前端浏览器中展示 ...

  5. yum安装php7

    1.安装epel源 yum -y install epel-release yum -y install http://dl.fedoraproject.org/pub/epel/epel-relea ...

  6. 如何将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中

    cat /etc/issue|tr '[:lower:]' [:upper:] >> /tmp/issue.out

  7. ubutu16.04编译安装apache

    // 安装编译器 sudo apt-get install build-essential // 下载所需依赖及apache2源码包 wget --no-check-certificate https ...

  8. 使用Postwoman

    postman的脱单产品postwoman 一.安装 1.使用git进行安装: git clone https://github.com/liyasthomas/postwoman cd postwo ...

  9. mysql数据库问题———登录进去无法操作显示You must reset your password using ALTER USER statement before executing this statement

    linux操作mysql数据库,可以登陆进去,但是操作所有命令都显示You must reset your password using ALTER USER statement before exe ...

  10. uboot第二阶段分析1

    一. uboot第二阶段初识 1.1. uboot第二阶段应该做什么 a. 概括来讲uboot第一阶段主要就是初始化了SoC内部的一些部件(譬如看门狗.时钟),然后初始化DDR并且完成重定位. b.  ...