遇到一個(gè)面試的場(chǎng)景題目,讓實(shí)現(xiàn)稅率的計(jì)算
請(qǐng)使用Java語(yǔ)言實(shí)現(xiàn)如下稅率計(jì)算:
1~5000 稅率 0
5001~8000 3%
8001~17000 10%
17001~30000 20%
30001~40000 25%
40001~60000 30%
60001~85000 35%
85001~ 45%
要求
ⅰ. 邏輯正確,代碼優(yōu)雅
ⅱ. 可擴(kuò)展性,考慮區(qū)間的變化,比如說(shuō)起征點(diǎn)從5000變成10000等等,或者說(shuō)85000以上的征稅50%。
ⅲ. 推薦使用合適的設(shè)計(jì)模式
這里舉個(gè)例子,比如說(shuō)稅前10000元,5000部分是不扣稅,后面5000,3000扣稅3%,2000扣稅10%。
?這里考慮使用責(zé)任鏈的模式實(shí)現(xiàn)
這里先實(shí)現(xiàn)了一個(gè)基本的Handler(其實(shí)也可以不用,因?yàn)檫@里實(shí)際上只給了一個(gè)實(shí)現(xiàn)handler),當(dāng)有多個(gè)的時(shí)候需要一個(gè)共同的父類(lèi)
package com.zhs.demoutil.chain;
import lombok.Data;
@Data
public abstract class BasePriceHandler{
private BasePriceHandler nextHandler;
public void setHandler(BasePriceHandler handler) {
this.nextHandler = handler;
}
// 計(jì)算價(jià)格,這里交給子類(lèi)實(shí)現(xiàn)
protected abstract double calculatePrice(double amount);
// 計(jì)算下一個(gè),如果有下一個(gè)的話(huà)
protected double calculatePriceNext(double quantity) {
if (nextHandler != null) {
return nextHandler.calculatePrice(quantity);
} else {
return 0.0;
}
}
}
這里是具體的實(shí)現(xiàn)的一個(gè)段的一個(gè)率的計(jì)算方式
package com.zhs.demoutil.chain;
class TieredPricingHandler extends BasePriceHandler {
// 數(shù)額
private final double start;
// 頂部金額,也就是在這區(qū)間進(jìn)行計(jì)算稅
private final double end;
// 對(duì)應(yīng)稅率
private final double tierPrice;
public TieredPricingHandler(double start,double end, double tierPrice) {
this.start = start;
this.end = end;
this.tierPrice = tierPrice;
}
// 具體的計(jì)算
public double calculatePrice(double amount) {
// 只有大于這個(gè)start的時(shí)候才需要用到這個(gè)handler,不然就可以直接算0
if (amount > start) {
double totalPrice = Math.min((amount-start),end-start) * tierPrice/100;
double remainingPrice = calculatePriceNext(amount);
return totalPrice + remainingPrice;
}
return 0;
}
}
增加一個(gè)鏈的類(lèi),用來(lái)組對(duì)應(yīng)的鏈結(jié)構(gòu)
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;
}
}
}
測(cè)試的執(zhí)行類(lèi)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-667751.html
package com.zhs.demoutil.chain;
public class Main {
public static void main(String[] args) {
PricingHandlerChain pricingHandlerChain = new PricingHandlerChain();
// 這里就是直接創(chuàng)建對(duì)應(yīng)的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("數(shù)量:" + quantity);
System.out.println("費(fèi)用:" + price);
}
}
這里就是責(zé)任鏈模式的實(shí)現(xiàn)了稅率的計(jì)算,只要是責(zé)任鏈,基本套路就是一樣的,可以定一個(gè)基類(lèi),然后子類(lèi)就去繼承,然后實(shí)現(xiàn)對(duì)應(yīng)的處理邏輯,可以在父類(lèi)里面直接調(diào)用下一個(gè),然后子類(lèi)里面實(shí)現(xiàn)當(dāng)前符合的計(jì)算邏輯,最后加一個(gè)Chain類(lèi)進(jìn)行組鏈,調(diào)用鏈的計(jì)算方法就可以了文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-667751.html
到了這里,關(guān)于設(shè)計(jì)模式-責(zé)任鏈模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!