责任链模式:

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

责任链模式的优缺点:

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

缺点:时间,内存的效果相对较大。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. 【深度学习】Pytorch 学习笔记

    目录 Pytorch Leture 05: Linear Rregression in the Pytorch Way Logistic Regression 逻辑回归 - 二分类 Lecture07 ...

  2. 【TCP/IP详解 卷一:协议】第二章:链路层

    2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...

  3. MVC ---- EF三层代码

    1.DAL层 using Night.Models; using System; using System.Collections.Generic; using System.Data.Entity. ...

  4. 安装 mysql8.0.13 (Ubuntu 16.04 desktop amd64)

    1.下载mysql deb https://dev.mysql.com/downloads/mysql/ #移动到/usr/local/src/目录,解压 sudo mv mysql-server_8 ...

  5. c++ 判断给定区间是否是一个heap. O(N) (is_heap)

    #include <iostream> // cout #include <algorithm> // is_heap, make_heap, pop_heap #includ ...

  6. c++ 数组元素拷贝到容器(copy)

    #include <iostream> // cout #include <algorithm> // copy #include <vector> // vect ...

  7. django查询集API

    本节将详细介绍查询集的API,它建立在下面的模型基础上,与上一节的模型相同: from django.db import models class Blog(models.Model): name = ...

  8. Java 注解的概念与种类

    Java 注解的概念与种类 一,什么是注解 注解和XML文件都是常用的,对web项目进行配置性描述的方式. 举个最简单的例子,对于一个Servlet,比如LoginServlet,采用如下方式: @W ...

  9. php file_get_contents计时读取一个文件/页面 防止读取不到内容

    php file_get_contents计时读取一个文件/页面 防止读取不到内容 $url = 'http://www.baidu.com/index.php'; $opts = array( 'h ...

  10. LICEcap 和 FS Capture入门教程

    上一篇介绍了如何使用 Visio 图形图表工具,文中贴了一张gif图,留言的小伙伴们迫不及待想知道如何录制 GIF 图,强哥姑且卖弄一次,把 PC 端截图工具和教程分享给大家,分别为 LICEcap ...