Java实现责任链模式
责任链模式:

将接受者对象连成一条链,并在该链上传递请求,直到一个几首这对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合。
责任链模式的优缺点:
优点:高内聚,低耦合。业务变更,新增一级处理时,只需要新增一个类即可。符合我们开闭原则(扩展开发,变更关闭)。
缺点:时间,内存的效果相对较大。java的AWT对责任链模式的抛弃,去拥抱了观察者模式。
应用:
Java异常处理机制
JavaScript事件模型
JavaEE的Filter拦截器
SpringSecurity Spring安全框架
实例:

变更需求

实例代码:
类结构图

具体代码:
package chengxuyuanzhilu.com.cor.handler; /**
* @author 微信公众号:程序员之路
* 价格处理人,负责处理客户折扣申请
*/
public abstract class PriceHandler { //直接后继,用于传递请求
protected PriceHandler successor; public void setSuccessor(PriceHandler successor) {
this.successor = successor;
} /*
* 处理折扣申请
*/
public abstract void processDiscount(float discount); } package chengxuyuanzhilu.com.cor.handler; /**
* @author 微信公众号:程序员之路
* 销售,可以批准5%以内的折扣
*/
public class Sales extends PriceHandler { @Override
public void processDiscount(float discount) {
if(discount <= 0.05){
System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
} } package chengxuyuanzhilu.com.cor.handler; /**
* @author 微信公众号:程序员之路
* 业务扩展,管理需要细分,新增以及销售层销售组长
* 销售小组长,可以批准15%以内的折扣
*/
public class Lead extends Sales{ @Override
public void processDiscount(float discount) {
if(discount <= 0.15){
System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
}
} package chengxuyuanzhilu.com.cor.handler; /**
* @author 微信公众号:程序员之路
* 销售经理,可以批准30%以内的折扣
*/
public class Manager extends Lead { @Override
public void processDiscount(float discount) {
if(discount <= 0.30){
System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
} } package chengxuyuanzhilu.com.cor.handler; /**
* @author 微信公众号:程序员之路
* 销售总监,可以批准40%以内的折扣
*/
public class Director extends Manager { @Override
public void processDiscount(float discount) {
if(discount <= 0.40){
System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
} } package chengxuyuanzhilu.com.cor.handler; /**
* @author 微信公众号:程序员之路
* 副总,可以批准50%以内的折扣
*/
public class VicePresident extends Director { @Override
public void processDiscount(float discount) {
if(discount <= 0.50){
System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
}else{
successor.processDiscount(discount);
}
} } package chengxuyuanzhilu.com.cor.handler; /**
* @author 微信公众号:程序员之路
* CEO,可以批准55%以内的折扣,可以拒绝高于55%的折扣
*/
public class CEO extends Manager { @Override
public void processDiscount(float discount) {
if(discount <= 0.55){
System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
}else{
System.out.format("%s拒绝了折扣:%2f%n",this.getClass().getName(),discount);
}
} } package chengxuyuanzhilu.com.cor.handler; /**
* @author 微信公众号:程序员之路
* 创建价格处理者工厂
*/
public class PriceHandleFactory { /*
* 工程模式创建价格处理者
*/
public static PriceHandler createPriceHandler() {
//向上转型
PriceHandler sales = new Sales();
PriceHandler lead = new Lead();//业务变更
PriceHandler manager = new Manager();
PriceHandler director = new Director();
PriceHandler vicePresident = new VicePresident();
PriceHandler ceo = new CEO(); //指定后继销售者
sales.setSuccessor(lead);
lead.setSuccessor(manager);//业务变更
manager.setSuccessor(director);
director.setSuccessor(vicePresident);
vicePresident.setSuccessor(ceo); return sales;
}
} package chengxuyuanzhilu.com.cor; import java.util.Random; import chengxuyuanzhilu.com.cor.handler.PriceHandleFactory;
import chengxuyuanzhilu.com.cor.handler.PriceHandler; /**
* @author 微信公众号:程序员之路
* 客户,请求折扣
*/
public class Customer {
private PriceHandler priceHandler; public void setPriceHandler(PriceHandler priceHandler) {
this.priceHandler = priceHandler;
} /*
* 发送请求
*/
public void requestDiscount(float discount) {
priceHandler.processDiscount(discount);
} //测试责任链模式
public static void main(String[] args) {
Customer customer = new Customer();
customer.setPriceHandler(PriceHandleFactory.createPriceHandler()); Random rand = new Random(); for(int i=1;i<100;i++){
System.out.println(i+":");
customer.requestDiscount(rand.nextFloat());
}
}
}
Java实现责任链模式的更多相关文章
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- java 设计模式 -- 责任链模式
设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...
- Java设计模式-责任链模式(Chain of Responsibility)
接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- java实现责任链模式的小demo
//一个请假请求 public class LeaveRequest { private int leaveDays; private String name; public void leave() ...
- 浅谈Java五大设计原则之责任链模式
首先我们得先定义一个责任链模式: 责任链模式是一种线性执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中, 由于执行的权利和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个 ...
随机推荐
- (转)Nuts and Bolts of Applying Deep Learning
Kevin Zakka's Blog About Nuts and Bolts of Applying Deep Learning Sep 26, 2016 This weekend was very ...
- [JVM] - 一份<自己动手写Java虚拟机>的测试版
go语言下载 配置GOROOT(一般是自动的),配置GOPATH(如果想自己改的话) 参照<自己动手写Java虚拟机> > 第一章 指令集和解释器 生成了ch01.exe文件 这里还 ...
- C语言通过枚举网卡,API接口可查看man 7 netdevice--获取接口IP地址
/*代码来自StackOverflow: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-c ...
- 51nod 1693 水群(神奇的最短路!)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1693 题意: 思路: 这个思路真是神了.. 对于每个点$i$,它需要和$ ...
- quality center 支持的平台
- pandas.read_csv参数整理
读取CSV(逗号分隔)文件到DataFrame,也支持文件的部分导入和选择迭代 更多帮助参见:http://pandas.pydata.org/pandas-docs/stable/io.html 参 ...
- 算法笔记--区间dp
1.石子归并问题 dp[i][j]表示区间i到j合并所需的最小花费. 先求出小区间的最小花费,再转移到大的区间. 转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1] ...
- python 函数参数介绍
python 函数参数介绍 python 使用过程总,总会遇到 *args,**kw形式的参数,总是一头雾水,而且网上介绍的或是叫法不一,为此专门深入实践进而了解了函数参数的使用 具体请看代码 #-* ...
- javascript对象使用总结
javascript对象使用总结 一.总结 一句话总结:js对象的主要知识点是创建对象和继承,并且创建对象和继承的方法都是逐步层层递进的 创建对象 继承 原型 创建对象 1 <script> ...
- Selenium之Action Chains类
Action Chains类常用于模拟鼠标的行为,比如单击,双击,拖拽等行为,使用下面的方法导入Action Chains类 from selenium.webdriver.common.action ...