设计模式Design Pattern(3) -- 责任链模式
什么是责任链模式?
责任链模式(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) -- 责任链模式的更多相关文章
- Java设计模式(14)责任链模式(Chain of Responsibility模式)
Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
- php设计模式课程---5、责任链模式是什么
php设计模式课程---5.责任链模式是什么 一.总结 一句话总结: 自己权限不够,就交给上级处理 1.选择结构怎么做到面向对象开闭原则? 也就是说if,都可以用接口的实现来实现,这样就避免了更新的时 ...
- java设计模式解析(11) Chain责任链模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...
- 设计模式-(15)责任链模式 (swift版)
一,概念: 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
- 【PHP设计模式 07_ZeRenLian.php】责任链模式
<?php /** * [责任链模式] * 情景设置:根据不同的需求,去找相应级别的责任人解决问题 */ header("Content-type: text/html; charse ...
- 【设计模式 - 13】之责任链模式(Chain Of Responsibility)
1 模式简介 责任链模式的简介: 1. 责任链模式为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一 ...
- Java设计模式(九)责任链模式 命令模式
(十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...
- java23种设计模式之十:责任链模式
最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式. 一.什么样的场景下会选择用责任链模式 我们在进行业务逻辑判断时,需 ...
- java设计模式(五)责任链模式
很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上某个对象决定处理此请求,应用场景如单位审批流程等. 要点:1)抽象处理者角色:定义处理请求接口及设定下家引用 2 ...
随机推荐
- Web - <a>标签中href="javascript:;"
javascript: 是一个伪协议,其他的伪协议还有 mail: tel: file: 等等. 1 <a id="jsPswEdit" class="set ...
- C# 创建和引入动态链接库dll文件
一.创建动态链接库dll文件 新建 -> 项目->类库 名称为:dlltest 添加函数:消息框弹出消息 using System.Collections.Generic; using S ...
- 如何在linux上部署vue项目
安装nginx的前奏 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 创建一个文件夹 cd /usr/ ...
- 同时安装 Python2 & Python3 cmd下版本自由选择
系统:win7 python2.7,python3.6同时安装,于是问题来了,python27与python36文件夹下的文件名都是python.exe 这样在cmd下,直接输入python,自动执行 ...
- 【ABAP系列】SAP S/4 HANA的SMARTFORMS如何切换到非word编辑器
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP S/4 HANA的SMA ...
- SpringBoot 使用 RestTemplate 调用exchange方法 显示错误信息
SpringBoot使用RestTempate SpringBoot使用RestTemplate摘要认证 SpringBoot使用RestTemplate基础认证 SpringBoot使用RestTe ...
- 华南理工大学 “三七互娱杯” C HRY and Abaas
https://ac.nowcoder.com/acm/contest/874/C 题目大意是两人俄罗斯轮盘赌 n个位置 有m个子弹 已知哪些位置上有子弹 子弹打出 游戏结束 求第i次扣动扳机游戏才结 ...
- CM使用MySQL数据库预处理scm_prepare_database.sh执行报错:java.sql.SQLException: Access denied for user 'scm'@'hadoop101.com' (using password: YES)
1.报错提示: [root@hadoop101 ~]# /opt/module/cm/cm-/share/cmf/schema/scm_prepare_database.sh mysql cm -hh ...
- VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题
VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题:https://blog.csdn.net/jerrica/article/d ...
- [BZOJ5306] [HAOI2018]染色(容斥原理+NTT)
[BZOJ5306] [HAOI2018]染色(容斥原理+NTT) 题面 一个长度为 n的序列, 每个位置都可以被染成 m种颜色中的某一种. 如果n个位置中恰好出现了 S次的颜色有 K种, 则小 C ...