什么是责任链模式
定义:
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
举例子:
击鼓传花:
击鼓者(Client)+ 花球(Request) + 众人组成(Handler Chain)
折扣申请:
不同的折扣 level , 需要不同的管理层级的人员(CEO,Vice President,Director,Manager,Sales)来批准。 客户不在乎是谁处理了这个请求,只要得到它要的折扣就行了。 # 如何实现责任链模式
责任链模式的实现
UML
PriceHandler.java
package com.imooc.pattern.cor.handler;
/*
* 价格处理人,负责处理客户折扣申请
*/
public abstract class PriceHandler {
/*
* 直接后继,用于传递请求
*/
protected PriceHandler successor;
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/*
* 处理折扣申请
*/
public abstract void processDiscount(float discount);
}
PriceHandlerFactory.java
package com.imooc.pattern.cor.handler;
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;
}
}
Sales.java PriceHandler 的一个具体子类实现,其他类似。
package com.imooc.pattern.cor.handler;
/*
* 销售, 可以批准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);
}
}
}
责任链模式如何解耦
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式的应用