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五大设计原则之责任链模式
首先我们得先定义一个责任链模式: 责任链模式是一种线性执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中, 由于执行的权利和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个 ...
随机推荐
- [JavaScript] - form表单转json的插件
jquery.serializejson.js 之前好像记录过,做项目又用到了再记下 在页面中引入js后就可以使用了 示例: //点击设置微信信息的form表单提交按钮后,执行wxConfig的con ...
- 【TCP/IP详解 卷一:协议】第一章概论 学习笔记
第一章 概述 游览了一下,本章主要是简介OSI模型的低层(1-4层).介绍了TCP/IP协议族的相关知识. TCP/IP的分层 Application <--> TCP / UDP < ...
- Python subprocess模块学习总结--转载
一.subprocess以及常用的封装函数运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序.在Python ...
- python 元组切片
#create a tuple tuplex = (, , , , , , , , , ) #used tuple[start:stop] the start index is inclusive a ...
- lombok 中的@Data注解
今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来. import lombok.Data; @Data public class V ...
- S4 对象系统
上一节中,我们介绍了 S3 系统.与大多数其他编程语言的面向对象系统不同,与那些类被定义为固定结构,且随着程序编译有确定的方法分派的系统相比,S3 系统显得非常不严谨.当我们定义一个 S3 类时,几乎 ...
- XML_CPP_资料_libXml2_01_Code
ZC: 这里的代码,就是 http://www.cnblogs.com/cppskill/p/6207609.html(我的文章"XML_CPP_资料_libXml2_01 - CppSki ...
- webpack 多页面支持 & 公共组件单独打包
webpack - 多页面/入口支持 & 公共组件单独打包 webpack系列目录 webpack 系列 一:模块系统的演进 webpack 系列 二:webpack 介绍&安装 we ...
- rem的计算
(function (doc, win) { console.log("dpr:"+win.devicePixelRatio); var docEle = doc.document ...
- Java基础九--抽象类
Java基础九--抽象类 一.抽象类介绍 /*抽象类:抽象:笼统,模糊,看不懂!不具体. 特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰. 抽象方法必须定义在抽象类中 ...