责任链模式:

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

责任链模式的优缺点:

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

缺点:时间,内存的效果相对较大。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. 实现分享功能插件2---jiathis分享插件应用

    博主原创:未经博主允许,不得转载 在上一篇的博文中分享了如何用百度分享插件实现分享功能,现在展示用jiathis进行实现分享功能: 主要代码如下: <body> <div class ...

  2. Kafka 及 PyKafka 的使用

    1. Kafka 1. 简介 Kafka 是一种分布式的.分区的.多副本的基于发布/订阅的消息系统.它是通过 zookeeper 进行协调,常见可以用于 web/nginx 日志.访问日志.消息服务等 ...

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

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

  4. VisualStudio使用技巧及快捷键

    1. 怎样调整代码排版的格式? 选择:编辑—>高级—>设置文档的格式或编辑—>高级—>设置选中代码的格式. 格式化cs代码:Ctrl+k+f 格式化aspx代码:Ctrl+k+ ...

  5. Linux进程内存布局(翻译)

    Anatomy of a Program in Memory 在一个多任务OS中,每个进程都运行在它自己的内存沙箱中.这个沙箱就是虚拟地址空间,在32位下就是一块容量为4GB的内存地址.内核将这些虚拟 ...

  6. IDEA Spring-boot-devTools 无效解决办法二

    转载地址:Intellij IDEA 使用Spring-boot-devTools无效解决办法 相信大部分使用Intellij的同学都会遇到这个问题,即使项目使用了spring-boot-devtoo ...

  7. Eclipse 打包jar

    1.将项目打成jar: 1.1 要将项目打包成jar文件,方法很多,可以用Eclipse自带的打包工具Ant打包,也可以用Eclipse的Export生成jar.经过尝试后,我不推荐用Ant打包,因为 ...

  8. mvn编译

    mvn clean install -pl com:boss -am -DskipTests

  9. Android中如何实现EditText的自动换行

    要实现EditText的自动换行需要实现如下设置: <EditText android:id="@+id/function_lifingcost_edit_txtRemark" ...

  10. Java基础十二--多态是成员的特点

    Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...