设计模式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 ...
随机推荐
- JavaScript-W3School-Browser 对象:Window open() 方法
ylbtech-JavaScript-Runoob-Browser 对象:Window open() 方法 1.返回顶部 1. Window open() 方法 Window 对象 定义和用法 op ...
- maven 配置参数详解!
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- Quartz-第三篇 quartz-misfire 错失,补偿执行
1.问题:使用pauseJob()后,再使用resumeJob(). Job如果中间时间足够短,默认会将之前错失的次数执行回来.这个问题的原因是执行调度策略的问题,quartz框架默认会将错失的执行次 ...
- 解决keil5中文注释乱码方法
菜单上面的edit-->Configuration-->Editor-->Encoding 选择Chinese GB2312 点击OK即可解决 参考 解决keil和source in ...
- Neo4j源代码分析
1.下载neo4j源码 https://github.com/neo4j/neo4j/ 参考文章 原文地址:https://blog.csdn.net/e15273/article/details/7 ...
- C++ constexpr
1.constexpr 1.const与constexpr: const: 承若不改变这个值,主要用于说明接口,这样在把变量传入函数时就不必担心变量会在函数内被改变了,编译器负责确认并执行const的 ...
- 神经网络之:S型神经元
1.S 型神经元和感知器类似,但是被修改为权重和偏置的微小改动只引起输出的微小变化 2.S型神经元结构: S型函数: 带有x1,x2,........,权重w1,w2.....,和偏置b的S型神经元的 ...
- wamp2.5最简单的虚拟主机配置
1.配置host文件 2.配置httpd.conf 去掉# LoadModule rewrite_module modules/mod_rewrite.so Include conf/extra/ht ...
- Python 实现类似sed命令的字符串替换小程序
环境 PyCharm, Windows 背景 sed命令 sed 's/原字符串/新字符串' 单引号中间是s表示替换,原字符串就是要被替换掉的字符串,新字符串就是想要的字符串. 效果 在命令行输入py ...
- netdevice - 底层访问 Linux 网络设备
总览 (SYNOPSIS) #include <sys/ioctl.h> #include <net/if.h> 描述 (DESCRIPTION) 本手册 描述 用于 配置 网 ...