设计模式-责任链模式

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

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

相关推荐
u***09641 分钟前
后端服务熔断降级策略,错误率阈值 什么是服务熔断降级
java·开发语言
烤麻辣烫2 分钟前
23种设计模式(新手)-3接口隔离原则
java·开发语言·学习·设计模式·intellij-idea
程序猿_极客11 分钟前
【2025最新】 Java 入门到实战:数组 + 抽象类 + 接口 + 异常(含案例 + 语法全解析+巩固练习题)
java·开发语言·后端·java基础·java入门到实战
v***431728 分钟前
spring.profiles.active和spring.profiles.include的使用及区别说明
java·后端·spring
艾莉丝努力练剑1 小时前
【C++:哈希表封装】用哈希表封装unordered_map和unordered_set
java·c++·stl·哈希算法·散列表·平衡二叉树·哈希
e***U8201 小时前
算法设计模式
算法·设计模式
Moe4881 小时前
@SpringBootApplication 注解(Spring Boot 自动配置)详解
java·后端
后端小张1 小时前
【JAVA 进阶】SpringBoot 事务深度解析:从理论到实践的完整指南
java·开发语言·spring boot·后端·spring·spring cloud·事务
合作小小程序员小小店1 小时前
web网页开发,在线%宠物销售%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·数据库·mysql·jdk·intellij-idea·宠物
合作小小程序员小小店1 小时前
web网页开发,在线%档案管理%系统,基于Idea,html,css,jQuery,java,ssh,mysql。
java·前端·mysql·jdk·html·ssh·intellij-idea