设计模式-责任链模式

遇到一个面试的场景题目,让实现税率的计算

请使用Java语言实现如下税率计算:

1~5000 税率 0

5001~8000 3%

8001~17000 10%

17001~30000 20%

30001~40000 25%

40001~60000 30%

60001~85000 35%

85001~ 45%

要求

ⅰ. 逻辑正确,代码优雅

ⅱ. 可扩展性,考虑区间的变化,比如说起征点从5000变成10000等等,或者说85000以上的征税50%。

ⅲ. 推荐使用合适的设计模式

这里举个例子,比如说税前10000元,5000部分是不扣税,后面5000,3000扣税3%,2000扣税10%。

�这里考虑使用责任链的模式实现

这里先实现了一个基本的Handler(其实也可以不用,因为这里实际上只给了一个实现handler),当有多个的时候需要一个共同的父类

java 复制代码
package com.zhs.demoutil.chain;

import lombok.Data;

@Data
public abstract class BasePriceHandler{

    private BasePriceHandler nextHandler;

    public void setHandler(BasePriceHandler handler) {
        this.nextHandler = handler;
    }
    // 计算价格,这里交给子类实现
    protected abstract double calculatePrice(double amount);
    // 计算下一个,如果有下一个的话
    protected double calculatePriceNext(double quantity) {
        if (nextHandler != null) {
            return nextHandler.calculatePrice(quantity);
        } else {
            return 0.0;
        }
    }
}

这里是具体的实现的一个段的一个率的计算方式

java 复制代码
package com.zhs.demoutil.chain;

class TieredPricingHandler extends BasePriceHandler {
    // 数额
    private final double start;
    // 顶部金额,也就是在这区间进行计算税
    private final double end;
    // 对应税率
    private final double tierPrice;



    public TieredPricingHandler(double start,double end, double tierPrice) {
        this.start = start;
        this.end = end;
        this.tierPrice = tierPrice;
    }

	// 具体的计算
    public double calculatePrice(double amount) {
        // 只有大于这个start的时候才需要用到这个handler,不然就可以直接算0
        if (amount > start) {
            double totalPrice = Math.min((amount-start),end-start) * tierPrice/100;
            double remainingPrice = calculatePriceNext(amount);
            return totalPrice + remainingPrice;
        }
        return 0;
    }
}

增加一个链的类,用来组对应的链结构

java 复制代码
package com.zhs.demoutil.chain;

class PricingHandlerChain {
    private BasePriceHandler headHandler;

    public void addHandler(BasePriceHandler handler) {
        if (headHandler == null) {
            headHandler = handler;
        } else {
            BasePriceHandler currentHandler = headHandler;
            while (currentHandler.getNextHandler() != null) {
                currentHandler = currentHandler.getNextHandler();
            }
            currentHandler.setNextHandler(handler);
        }
    }

    public double calculatePrice(int quantity) {
        if (headHandler != null) {
            return headHandler.calculatePrice(quantity);
        } else {
            return 0.0;
        }
    }
}

测试的执行类

java 复制代码
package com.zhs.demoutil.chain;

public class Main {
    public static void main(String[] args) {
        PricingHandlerChain pricingHandlerChain = new PricingHandlerChain();
    	// 这里就是直接创建对应的handler然后加入到链里面
        pricingHandlerChain.addHandler(new TieredPricingHandler(0,5000, 0));
        pricingHandlerChain.addHandler(new TieredPricingHandler(5000,8000, 3));
        pricingHandlerChain.addHandler(new TieredPricingHandler(8000,17000, 10));
        pricingHandlerChain.addHandler(new TieredPricingHandler(17000,30000, 20));
        pricingHandlerChain.addHandler(new TieredPricingHandler(30000,40000, 25));
        pricingHandlerChain.addHandler(new TieredPricingHandler(40000,60000, 30));
        pricingHandlerChain.addHandler(new TieredPricingHandler(60000,85000, 35));
        pricingHandlerChain.addHandler(new TieredPricingHandler(85000,Integer.MAX_VALUE, 45));

        int quantity = 10000;
        double price = pricingHandlerChain.calculatePrice(quantity);
        System.out.println("数量:" + quantity);
        System.out.println("费用:" + price);
    }
}

这里就是责任链模式的实现了税率的计算,只要是责任链,基本套路就是一样的,可以定一个基类,然后子类就去继承,然后实现对应的处理逻辑,可以在父类里面直接调用下一个,然后子类里面实现当前符合的计算逻辑,最后加一个Chain类进行组链,调用链的计算方法就可以了

相关推荐
覆东流6 小时前
7.Java数组
java·开发语言·后端
m0_719084116 小时前
限流和获取请求ip的方法
java
lzhdim7 小时前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
深漂的华哥7 小时前
Ruoyi-Plus前后端分离场景下,数据加密传输
java·spring boot·后端·开源·maven·ruoyi
落魄大学生之流水线上谋生计9 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
爱学习的小白柏10 小时前
【AI问数技术】多Agent协同架构:查询规划/SQL生成/洞察分析/报告生成
java·网络·人工智能·windows·sql·架构·llama
码匠许师傅10 小时前
【C++ 面试真题】30. 聊聊 C++ 的互斥锁与读写锁
java·c++·面试
Larcher10 小时前
SDD 项目开发步骤与提示词
人工智能·设计模式·架构
沙盘客10 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
CHANCE V11 小时前
集合排序和流排序
java