设计模式-责任链模式

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

请使用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类进行组链,调用链的计算方法就可以了

相关推荐
这个昵称不容易3 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长3 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊4 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼5 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
心若自由何处是束缚6 小时前
适配器模式:从原理到实战的完整指南
设计模式·适配器模式
文丑颜不良啊7 小时前
LeetCode2161~2180题目解析
java·leetcode
文丑颜不良啊8 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发8 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力9 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力9 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python