时间:2017年08月30日星期三
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:https://github.com/zccodere/s...
学习源码:https://github.com/zccodere/s...
课程大纲
什么是责任链模式 如何实现责任链模式 责任链模式如何解耦 责任链模式的应用
案例:售楼案例
责任链模式定义
将介绍者对象连成一条链,并在该链上传递请求,直到有一个接收者对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接收到之间的耦合。
责任链模式类图
第二章:责任链模式实现 2-1 简单实现不同的角色拥有不同的折扣权限
代码编写
1.编写PriceHandler类
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 责任链模式 * @describe 价格处理人,负责处理客户折扣申请 * @author zc * @version 1.0 2017-08-30 */ public abstract class PriceHandler { protected PriceHandler successor; public void setSuccessor(PriceHandler successor) { this.successor = successor; } /** * 处理折扣申请 */ public abstract void processDiscount(float discount); /** * 创建PriceHandler的工厂方法 */ public static PriceHandler createPriceHandler() { // 创建对象 PriceHandler sales = new Sales(); PriceHandler man = new Manager(); PriceHandler dir = new Director(); PriceHandler vp = new VicePresident(); PriceHandler ceo = new CEO(); // 指定直接后继 sales.setSuccessor(man); man.setSuccessor(dir); dir.setSuccessor(vp); vp.setSuccessor(ceo); // 返回销售人员 return sales; } }
2.编写Sales类
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 责任链模式 * @describe 销售,可以批准5%以内的折扣 * @author zc * @version 1.0 2017-08-30 */ 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); } } }
3.编写Manager类
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 责任链模式 * @describe 销售经理, 可以批准30%以内的折扣 * @author zc * @version 1.0 2017-08-30 */ public class Manager extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.3){ System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
4.编写Director类
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 责任链模式 * @describe 销售总监, 可以批准40%以内的折扣 * @author zc * @version 1.0 2017-08-30 */ public class Director extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.4){ System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
5.编写VicePresident类
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 责任链模式 * @describe 销售副总裁, 可以批准50%以内的折扣 * @author zc * @version 1.0 2017-08-30 */ public class VicePresident extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.5){ System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
6.编写CEO类
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 责任链模式 * @describe CEO, 可以批准55%以内的折扣。折扣超出55%, 就拒绝申请 * @author zc * @version 1.0 2017-08-30 */ public class CEO extends PriceHandler { @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); } } }2-2 客户请求
代码编写
1.编写Customer类
package com.myimooc.designpattern.c6chainofresponsibility; import java.util.Random; import com.myimooc.designpattern.c6chainofresponsibility.handler.PriceHandler; /** * @title 责任链模式 * @describe 客户,请求折扣 * @author zc * @version 1.0 2017-08-30 */ 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(PriceHandler.createPriceHandler()); Random rand = new Random(); for(int i=1;i<=100;i++){ System.out.print(i+":"); customer.requestDiscount(rand.nextFloat()); } } }2-3 重构优化
代码编写
1.编写Lead类
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 责任链模式 * @describe 销售小组长, 可以批准15%以内的折扣 * @author zc * @version 1.0 2017-08-30 */ public class Lead extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.15){ System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
2.编写PriceHandlerFactory类
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 责任链模式 * @describe 创建PriceHandler的工厂类 * @author zc * @version 1.0 2017-08-30 */ public class PriceHandlerFactory { /** * 创建PriceHandler的工厂方法,简单工厂方法或静态工厂方法 */ public static PriceHandler createPriceHandler() { PriceHandler sales = new Sales(); PriceHandler lead = new Lead(); PriceHandler man = new Manager(); PriceHandler dir = new Director(); PriceHandler vp = new VicePresident(); PriceHandler ceo = new CEO(); sales.setSuccessor(lead); lead.setSuccessor(man); man.setSuccessor(dir); dir.setSuccessor(vp); vp.setSuccessor(ceo); return sales; } }
3.修改Customer类
package com.myimooc.designpattern.c6chainofresponsibility; import java.util.Random; import com.myimooc.designpattern.c6chainofresponsibility.handler.PriceHandler; import com.myimooc.designpattern.c6chainofresponsibility.handler.PriceHandlerFactory; /** * @title 责任链模式 * @describe 客户,请求折扣 * @author zc * @version 1.0 2017-08-30 */ 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(PriceHandlerFactory.createPriceHandler()); Random rand = new Random(); for(int i=1;i<=100;i++){ System.out.print(i+":"); customer.requestDiscount(rand.nextFloat()); } } }第三章:责任链模式剖析 3-1 深入剖析
利于解耦
发出请求的客户端并不知道链上的哪一个接收者会处理这个请求,从而实现了客户端和接收者之间的解耦
责任链模式缺点
1.时间:在单个hander对象的时间很短,但是在遍历整条链时会花费较长的时间 2.内存:在创建整条链时,会创建很多类,导致内存增加第四章:责任链模式应用 4-1 应用案例
Java的异常机制:Exception Handling
异常是请求,调用栈中的每一级是一个handler, 这些栈中的handler共同构建成一个责任链, 栈顶元素就是上一级元素的直接后继。
JavaScript的事件模型:JavaScript Event Model
每一个dom节点都是一个handler,当点击节点时, 它所对应的父节点就是该handler的直接后继, 这个handler可以选择在自己的层级处理掉点击事件,也可以选择不处理,直接向后继传递。 JavaWeb开发过滤器链:FileterChain in Web
一点体会
将设计模式的思想与OO原则相关联 在设计模式中发现OO原则可以加深理解和记忆 最重要的是要去理解模式如何使我们去应对变化 如何让我们能够用一种抽象的方式来编程文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70322.html
相关文章
慕课网_《模式的秘密之单例模式》学习总结
时间:2017年08月27日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github.com/zccodere/s... 第一章:单例模式简介 1-1 简介 单例模式 概念及应用场合 饿汉模式 懒汉模式 饿汉模式与懒汉模式的区别 什么是设计模式 是一套被反...
慕课网_《模式的秘密之工厂模式》学习总结
摘要:时间年月日星期日说明本文部分内容均来自慕课网。这对所有形态的工厂模式都是重要的这个系统的产品有至少一个的产品族同属于一个产品族的产品是设计成在一起使用的。 时间:2017年08月27日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github.c...
慕课网_《模式的秘密之适配器模式》学习总结
摘要:时间年月日星期二说明本文部分内容均来自慕课网。慕课网教学源码学习源码第一章适配器模式的简介简介生活中的适配器翻译软件插座适配器适配器模式定义适配器模式讲将一个类的接口,转换成客户期望的另外一个接口。 时间:2017年08月29日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s.....
慕课网_《模式的秘密之模版模式》学习总结
摘要:时间年月日星期六说明本文部分内容均来自慕课网。案例介绍饮料机配置模版把水煮沸泡饮料把饮料倒进杯子加调味料第二章模版模式实现基本框架代码编写编写类模版模式抽象基类,为所有子类提供一个算法框架。 时间:2017年09月02日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源...
慕课网_《模式的秘密之策略模式》学习总结
时间:2017年08月31日星期四说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github.com/zccodere/s... 第一章:策略模式简介 1-1 简介 课程大纲 什么是策略模式 策略模式如何实现 策略模式总结篇 实例案例分享 日常生活中的策略 Wor...
发表评论
0条评论
jsyzchen
男|高级讲师
TA的文章
阅读更多
pip3安装tensorflow
阅读 2747·2023-04-26 01:47
rnn
阅读 3576·2023-04-25 23:45
4G DTU+MODBUS温湿度传感器+MQTT连接电信云
阅读 2377·2021-10-13 09:39
程序员的自我修养 第四章 库与运行库 - 系统调用 中断
阅读 580·2021-10-09 09:44
自己的主机做服务器网站如何备案-我用自己的电脑做服务器,网站怎么备案?
阅读 1757·2021-09-22 15:59
HTML和DIV表格在线生成工具 可视化拖拽画表格
阅读 2672·2021-09-13 10:33
Python爬虫实战之爬淘宝商品并做数据分析,现在赚钱没点技术还真不行!
阅读 1631·2021-09-03 10:30
[CSS]关于盒子模型
阅读 633·2019-08-30 15:53
阅读需要支付1元查看