慕课网《模式的秘密之责任链模式》学习总结
时间:2017年08月30日星期三
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:https://github.com/zccodere/study-imooc
学习源码:https://github.com/zccodere/study-imooc
第一章:责任链模式简介
1-1 课程简介
课程大纲
什么是责任链模式
如何实现责任链模式
责任链模式如何解耦
责任链模式的应用
案例:售楼案例
责任链模式定义
将介绍者对象连成一条链,并在该链上传递请求,直到有一个接收者对象处理它。
通过让更多对象有机会处理请求,避免了请求发送者和接收到之间的耦合。
责任链模式类图
第二章:责任链模式实现 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,当点击<td>节点时,
它所对应的父节点就是该handler的直接后继,
这个handler可以选择在自己的层级处理掉点击事件,也可以选择不处理,直接向后继传递。
JavaWeb开发过滤器链:FileterChain in Web
一点体会
将设计模式的思想与OO原则相关联
在设计模式中发现OO原则可以加深理解和记忆
最重要的是要去理解模式如何使我们去应对变化
如何让我们能够用一种抽象的方式来编程