设计模式---责任链模式

责任链模式 
Chain of Responsibility

  1. 什么是责任链模式
  2. 如何实现责任链模式
  3. 责任链模式如何解耦
  4. 责任链模式的应用

生活中的COR 
- 击鼓传花 
- 申请折扣

天然的责任链:公司层级结构 
- CEO 
- Vice President 
- Director/Manager 
- Sales

Handler:Sales->Manager->Director->Vice President->CEO 
Client: 老张、王老板、小王 request

有求必应的销售团队

  • CEO <=55%
  • Vice President <=50%
  • Director <=40%
  • Manager <=30%
  • Sales <=5%

PriceHandler接口

package com.evior.designPattern.pricehandler;

import com.evior.designPattern.factory.PriceHandlerFactory;

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() {

        PriceHandlerFactory priceHandlerFactory=new PriceHandlerFactory();
        PriceHandler priceHandler = priceHandlerFactory.createPriceHandler();
        return priceHandler;

    }
}

SalesPriceHandler  <=5%

package com.evior.designPattern.pricehandler;

public class SalesPriceHandler 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);
        }

    }
}

LeadPriceHandler  <=15%

package com.evior.designPattern.pricehandler;

public class LeadPriceHandler 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);
        }
    }
}

ManagerPriceHandler   <=30%

package com.evior.designPattern.pricehandler;

public class ManagerPriceHandler 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);
            }
    }
}

DirectorPriceHandler <=40%

package com.evior.designPattern.pricehandler;

public class DirectorPriceHandler 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);
        }
    }
}

VicePresidentPriceHandler  <=50%

package com.evior.designPattern.pricehandler;

public class VicePresidentPriceHandler 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);
        }
    }
}

CEOPriceHandler  <=55%

package com.evior.designPattern.pricehandler;

public class CEOPriceHandler 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);
        }
    }
}

PriceHandlerFactory

package com.evior.designPattern.factory;

import com.evior.designPattern.pricehandler.*;

/**
 * 工厂  
 * 构建责任链   
 * 返回最底层
 */
public class PriceHandlerFactory {

    /*
     * 创建PriceHandler的工厂方法
     */
    public static PriceHandler createPriceHandler() {

        PriceHandler sales = new SalesPriceHandler();
        PriceHandler lead = new LeadPriceHandler();
        PriceHandler man = new ManagerPriceHandler();
        PriceHandler dir = new DirectorPriceHandler();
        PriceHandler vp = new VicePresidentPriceHandler();
        PriceHandler ceo = new CEOPriceHandler();

        //设置sale的上一级
        sales.setSuccessor(lead);
        //设置sale的上一级
        lead.setSuccessor(man);
        //设置sale的上一级
        man.setSuccessor(dir);
        //设置sale的上一级
        dir.setSuccessor(vp);
        //设置sale的上一级
        vp.setSuccessor(ceo);

        //最底层
        return sales;
    }

}

Customer

 

package com.evior.designPattern.customer;

import com.evior.designPattern.pricehandler.PriceHandler;

import java.util.Random;

public class Customer {


    private PriceHandler priceHandler;

    public void setPriceHandler(PriceHandler priceHandler) {
        this.priceHandler = priceHandler;
    }

    public void requestDiscount(float discount){
        priceHandler.processDiscount(discount);
    }



}

测试

package com.evior.designPattern;

import com.evior.designPattern.customer.Customer;
import com.evior.designPattern.pricehandler.PriceHandler;

import java.util.Random;

public class Test {

    public static void main(String[] args){
        Customer customer = new Customer();
        customer.setPriceHandler(PriceHandler.createPriceHandler());
        Random rand = new Random();
        for(int i=1;i<=10;i++){
            System.out.print(i+":");
            customer.requestDiscount(rand.nextFloat());
        }
    }
}

结果

构建图

剖析责任链模式

在责任链模式中,作为请求接收者的多个对象通过对其后继的引用而连接起来形成一 
条链。请求在这条链上传递,直到链上某一个接收者处理这个请求。每个接收者都可 
以选择自行处理请求或是向后继传递请求。

依赖于抽象不依赖于具体

发送请求的客户端并不知道链上的哪一个接收者会处理这个请求,从而实现了客户端 
和接收者之间的解耦。

真的好吗?

  • 开闭原则 
    扩展开放,修改关闭 
    永远没有正确答案,取决于项目实际对降低耦合的要求是什么,是否有其他替代方案, 
    根据实际情况取舍而来
  • 执行性能 
    处理器首尾相接,有请求时需要遍历链 
    时间、内存

awt早期使用责任链模式,现在改为了观察者模式

责任链模式的应用

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的基本原则

猜你喜欢

转载自blog.csdn.net/qq_30904985/article/details/82149621