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());
        }
    }
}

 

转载于:https://www.cnblogs.com/chengxuyuanzhilu/p/4691736.html

Java可以通过实现责任链模式实现请求的处理。责任链模式是一种行为设计模式,它允许将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。每个处理者都可以决定是否将请求传递给下一个处理者,从而形成一条处理链。Tamarack是一个用Java实现责任链模式的微框架,它通过为个对象提供处理请求的机会,避免将请求的发送者与其接收者耦合。链接接收对象并沿链传递请求,直到对象处理它。 代码实现如下(Java): ```java public abstract class Handler { protected Handler successor; public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void handleRequest(Request request); } public class ConcreteHandler1 extends Handler { public void handleRequest(Request request) { if (request.getType() == RequestType.TYPE1) { System.out.println(request.getName() + " is handle by ConcreteHandler1"); return; } if (successor != null) { successor.handleRequest(request); } } } public class ConcreteHandler2 extends Handler { public void handleRequest(Request request) { if (request.getType() == RequestType.TYPE2) { System.out.println(request.getName() + " is handle by ConcreteHandler2"); return; } if (successor != null) { successor.handleRequest(request); } } } public class Request { private String name; private RequestType type; public Request(String name, RequestType type) { this.name = name; this.type = type; } public String getName() { return name; } public RequestType getType() { return type; } } public enum RequestType { TYPE1, TYPE2 } public class ChainOfResponsibilityDemo { public static void main(String[] args) { Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); h1.setSuccessor(h2); Request request1 = new Request("Request1", RequestType.TYPE1); h1.handleRequest(request1); Request request2 = new Request("Request2", RequestType.TYPE2); h1.handleRequest(request2); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值