Java实现责任链模式

责任链模式:

将接受者对象连成一条链,并在该链上传递请求,直到一个几首这对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合。

 

责任链模式的优缺点:

优点:高内聚,低耦合。业务变更,新增一级处理时,只需要新增一个类即可。符合我们开闭原则(扩展开发,变更关闭)。

缺点:时间,内存的效果相对较大。java的AWT对责任链模式的抛弃,去拥抱了观察者模式。

 

应用:

Java异常处理机制

JavaScript事件模型

JavaEE的Filter拦截器

SpringSecurity  Spring安全框架

 

实例:

 

变更需求

 

实例代码:

      类结构图

     

          具体代码:

        

package chengxuyuanzhilu.com.cor.handler;

/**
 * @author 微信公众号:程序员之路
 * 价格处理人,负责处理客户折扣申请
 */
public abstract class PriceHandler {
    
    //直接后继,用于传递请求
    protected PriceHandler successor;

    public void setSuccessor(PriceHandler successor) {
        this.successor = successor;
    }
    
    /*
     * 处理折扣申请
     */
    public abstract void processDiscount(float discount);

}

package chengxuyuanzhilu.com.cor.handler;

/**
 * @author 微信公众号:程序员之路
 * 销售,可以批准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);
        }
    }

}

package chengxuyuanzhilu.com.cor.handler;

/**
 * @author 微信公众号:程序员之路
 * 业务扩展,管理需要细分,新增以及销售层销售组长
 * 销售小组长,可以批准15%以内的折扣
 */
public class Lead extends Sales{
    
    @Override
    public void processDiscount(float discount) {
        if(discount <= 0.15){
            System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
        }else{
            successor.processDiscount(discount);
        }
    }
}

package chengxuyuanzhilu.com.cor.handler;

/**
 * @author 微信公众号:程序员之路
 * 销售经理,可以批准30%以内的折扣
 */
public class Manager extends Lead {
    
    @Override
    public void processDiscount(float discount) {
        if(discount <= 0.30){
            System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
        }else{
            successor.processDiscount(discount);
        }
    }

}

package chengxuyuanzhilu.com.cor.handler;

/**
 * @author 微信公众号:程序员之路
 * 销售总监,可以批准40%以内的折扣
 */
public class Director extends Manager {
    
    @Override
    public void processDiscount(float discount) {
        if(discount <= 0.40){
            System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
        }else{
            successor.processDiscount(discount);
        }
    }

}

package chengxuyuanzhilu.com.cor.handler;

/**
 * @author 微信公众号:程序员之路
 * 副总,可以批准50%以内的折扣
 */
public class VicePresident extends Director {
    
    @Override
    public void processDiscount(float discount) {
        if(discount <= 0.50){
            System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount);
        }else{
            successor.processDiscount(discount);
        }
    }

}

package chengxuyuanzhilu.com.cor.handler;

/**
 * @author 微信公众号:程序员之路
 * CEO,可以批准55%以内的折扣,可以拒绝高于55%的折扣
 */
public class CEO extends Manager {
    
    @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);
        }
    }

}

package chengxuyuanzhilu.com.cor.handler;

/**
 * @author 微信公众号:程序员之路
 * 创建价格处理者工厂
 */
public class PriceHandleFactory {
    
    /*
     * 工程模式创建价格处理者
     */
    public static PriceHandler createPriceHandler() {
        //向上转型
        PriceHandler sales = new Sales();
        PriceHandler lead = new Lead();//业务变更
        PriceHandler manager = new Manager();
        PriceHandler director = new Director();
        PriceHandler vicePresident = new VicePresident();
        PriceHandler ceo = new CEO();
        
        //指定后继销售者
        sales.setSuccessor(lead);
        lead.setSuccessor(manager);//业务变更
        manager.setSuccessor(director);
        director.setSuccessor(vicePresident);
        vicePresident.setSuccessor(ceo);
        
        return sales;
    }
}

package chengxuyuanzhilu.com.cor;

import java.util.Random;

import chengxuyuanzhilu.com.cor.handler.PriceHandleFactory;
import chengxuyuanzhilu.com.cor.handler.PriceHandler;

/**
 * @author 微信公众号:程序员之路
 * 客户,请求折扣
 */
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(PriceHandleFactory.createPriceHandler());
        
        Random rand = new Random();
        
        for(int i=1;i<100;i++){
            System.out.println(i+":");
            customer.requestDiscount(rand.nextFloat());
        }
    }
}

 

posted @ 2015-07-31 11:34  RedAnts  阅读(2124)  评论(0编辑  收藏  举报