设计模式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 ...
随机推荐
- Docker追加容器端口映射
参考文章: https://blog.csdn.net/chouzhou9701/article/details/86725203
- Go开发[八]goroutine和channel
进程和线程 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 一个进程可以创 ...
- ffmpeg mp4 to wmv and wmv to mp4
//大小=>变小ffmpeg -i 1.mp4 -b:v 2M -vcodec msmpeg4 -acodec wmav2 1_mp4.wmv//大小=>变大ffmpeg -i 1.mp4 ...
- 类Enum
int compareTo(E o) 比较此枚举与指定对象的顺序. String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明. int ordinal() 返回枚举常量的序数(它在 ...
- .net 部署到服务端IIS,Process调用exe程序无法运行问题解决
场景: 开发某一功能将html内容转换为pdf,采用第三方插件wkhtmltopdf.exe进行转换.在本地调试正常运行,部署到服务端后文件没有正常生成. IIS中,Process打不开cmd程序,程 ...
- HTML5——添加新元素 新元素 Canvas SVG MathML 黑客帝国特效
为HTML添加新元素 添加新元素 + 该元素定义样式 <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 项目测试完成后,总结典型性bug,以测试的角度,应该怎么筛选bug
一个wap端改版项目完结了,总结下测试过程中的典型性bug:应该从哪个角度去总结? 有点疑问?不知道是以bug的影响度去总结,还是以优先级去总结(好像优先级和影响度是成正比的,优先级比较高的bug,影 ...
- vue+sentry 前端异常日志监控
敲代码最糟心不过遇到自己和测试的环境都OK, 客户使用有各种各样还复现不了的问题,被逼无奈只能走到这一步:前端异常日志监控! vue官方文档如下推荐: 就是说, vue有错误机制处理errorHand ...
- js 如何定义函数
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Linux 查看CPU 核数 还有 CPU 个数的命令
cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l 个数 cat /proc/cpuinfo | grep 'process' | ...