第1章 什么是责任链模式
1-1 什么是责任链模式
责任链模式
Chain of Responsibility
- 什么是责任链模式
- 如何实现责任链模式
- 责任链模式如何解耦
- 责任链模式的应用
生活中的COR
- 击鼓传花
- 申请折扣
天然的责任链:公司层级结构
- CEO
- Vice President
- Director/Manager
- Sales
Handler:Sales->Manager->Director->Vice President->CEO
Client: 老张、王老板、小王 request
第2章 有求必应的销售队伍:怎样实现责任链模式
2-1 有求必应的销售团队
- CEO <=55%
- Vice President <=50%
- Director <=40%
- Manager <=30%
- Sales <=5%
/*
* 价格处理人,负责处理客户折扣申请
*/
public abstract class PriceHandler {
/*
* 直接后继,用于传递请求
*/
protected PriceHandler successor;
public void setSuccessor(PriceHandler successor) {
this.successor = successor;
}
/*
* 处理折扣申请
*/
public abstract void processDiscount(float discount);
}
/*
* 销售, 可以批准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);
}
}
}
/*
* 销售经理, 可以批准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);
}
}
}
/*
* 销售总监, 可以批准40%以内的折扣
*/
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);
}
}
}
/*
* 销售副总裁, 可以批准50%以内的折扣
*/
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);
}
}
}
/*
* CEO, 可以批准55%以内的折扣
* 折扣超出55%, 就拒绝申请
*/
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 千姿百态的客户请求
/*
* 客户,请求折扣
*/
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());
}
}
}
/*
* 价格处理人,负责处理客户折扣申请
*/
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 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;
}
}
2-3 不管怎么变折扣你得批
加入销售组长 折扣15%
/*
* 销售小组长, 可以批准15%以内的折扣
*/
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);
}
}
}
/*
* 客户,请求折扣
*/
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());
}
}
}
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章 剖析责任链模式
3-1 剖析责任链模式
在责任链模式中,作为请求接收者的多个对象通过对其后继的引用而连接起来形成一
条链。请求在这条链上传递,直到链上某一个接收者处理这个请求。每个接收者都可
以选择自行处理请求或是向后继传递请求。
依赖于抽象不依赖于具体
发送请求的客户端并不知道链上的哪一个接收者会处理这个请求,从而实现了客户端
和接收者之间的解耦。
真的好吗?
- 开闭原则
扩展开放,修改关闭
永远没有正确答案,取决于项目实际对降低耦合的要求是什么,是否有其他替代方案,
根据实际情况取舍而来 - 执行性能
处理器首尾相接,有请求时需要遍历链
时间、内存
awt早期使用责任链模式,现在改为了观察者模式
第4章 责任链模式的实际应用
4-1 责任链模式的应用
Exception Handling
main->Method with an exception handler->Method without an exception handler->Method where error occurred
JavaScript Event Model
capture phase(捕获) -> target phase -> bubbling phase(冒泡)
FilterChain in Web
设计模式和oo的基本原则