责任链模式:

将接受者对象连成一条链,并在该链上传递请求,直到一个几首这对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合。

责任链模式的优缺点:

优点:高内聚,低耦合。业务变更,新增一级处理时,只需要新增一个类即可。符合我们开闭原则(扩展开发,变更关闭)。

缺点:时间,内存的效果相对较大。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实现责任链模式的更多相关文章

  1. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  2. 我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  3. Java设计模式の责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

  5. Java设计模式-责任链模式(Chain of Responsibility)

    接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任 ...

  6. Java设计模式-责任链模式

    提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...

  7. Java设计模式—责任链模式

    责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...

  8. java实现责任链模式的小demo

    //一个请假请求 public class LeaveRequest { private int leaveDays; private String name; public void leave() ...

  9. 浅谈Java五大设计原则之责任链模式

    首先我们得先定义一个责任链模式: 责任链模式是一种线性执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中, 由于执行的权利和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个 ...

随机推荐

  1. require的shim解释

    通过require加载的模块一般都需要符合AMD规范即使用define来申明模块,但是部分时候需要加载非AMD规范的js,这时候就需要用到另一个功能:shim,shim解释起来也比较难理解,shim直 ...

  2. The way to Go(5): 文件名、关键字与标识符

    Reference: Github: Go Github: The way to Go 文件名 1.后缀名:.go 2.小写字母 3._分割名称 4.不包含空格或其他特殊字符 标识符 有效的标识符必须 ...

  3. jerichotab 初始化页面显示tab页中的第一个

    tab初始化默认显示第一个内容,但是tab标签显示最后一个. 源代码: $.fn.initJerichoTab({ renderTo: '#consumable', uniqueId: 'jerich ...

  4. QQ名片自动点赞

    2017-01-23 简介:QQ名片自动点赞,1秒左右可点完1屏好友的赞,每个好友10个赞. 尺寸: 720*1280 DPI:320 宿主:3.1.2.10711 系统:Android v5.11 ...

  5. 配置caffe中出现的问题汇总

    1,运行下面代码时: sudo apt-get install libopencv 出错: E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系 原因: 源(source ...

  6. python3.7 安装pyopengl,环境搭建

    安装环境:win10 64位操作系统,python3.7 一.安装py库 需要用pip 安装 pip install PyOpenGL PyOpenGL_accelerate 可能会报错, 是因为没有 ...

  7. shell 脚本中所有循环语法

    写出 shell 脚本中所有循环语法 for 循环 : for i in $(ls);do echo item:$i done while 循环 : #!/bin/bash COUNTER=0 whi ...

  8. grafana 批量添加图表

    利用grafana做监控展示特别方便,而且界面还很有科技感,一般的使用都是自己手动添加图表,或者使用别人提供好的模板. 在一种情况下就比较尴尬了,我有100个实例的内存数据想展示,如果都放在一个tab ...

  9. vuejs2点滴

    在Vue定义一个不被添加getter setter 的属性: https://github.com/vuejs/vue/issues/1988 博客: 0.vux的x-input源码分析. http: ...

  10. Zend Studio获取永久使用权

    网上有很多破解方式,什么注册码之类的,但是经过本人尝试有一个很easy的方法,那就是不用破解,让我们永久性试用下去! 当我们打开软件试用的时候试用期都是30天,当使用快到期的时候我们 打开目录C:\U ...