国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用簡單工廠編寫不同的分潤規(guī)則

Lucky_Boy / 1100人閱讀

摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言在工作項(xiàng)目中遇到以下一個(gè)問題公司有一款產(chǎn)品遇到給不同代理商代理售賣但是不同的代理商分潤的方式各自不同有以下幾個(gè)中分潤方式每筆固定收益元,則填寫代理商收益每筆收益率為則填寫

本人郵箱:
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經(jīng)全部托管github有需要的同學(xué)自行下載

引言

在工作項(xiàng)目中遇到以下一個(gè)問題.
公司有一款產(chǎn)品,遇到給不同代理商代理售賣.但是不同的代理商分潤的方式各自不同.有以下幾個(gè)中分潤方式.

每筆固定收益1元,則填寫代理商收益1.00

每筆收益率為0.1%則填寫代理商收益0.1%

每筆收益率為0.1%加上固定收益1元,則填寫代理商收益0.1%+1.00

每筆收益率為0.1%,封頂3元,保底1元?jiǎng)t填寫代理商收益1.00~0.1%~3.00

梯度分潤 例如 0.1%<10000<0.2%<20000<0.3%<30000<0.5%

少于10000 按照 0.1% 分潤

少于20000 按照 0.2% 分潤

少于30000 按照 0.3% 分潤

多于30000 按照 0.5% 分潤

然而發(fā)現(xiàn)公司的項(xiàng)目代碼中竟然是硬編碼的.強(qiáng)硬的解析是否,把所有規(guī)則需要使用的參數(shù)信息都集中在一個(gè)類中,不利于維護(hù).

多說無益,讓各位感受一下項(xiàng)目中的代碼吧.

public class AgentShareRule {
    private Integer profitType; // 分潤類型
    private BigDecimal perFixIncome;    //第一,四種情況時(shí)用到的參數(shù)
    private BigDecimal perFixInrate;    //第二.三,四種情況時(shí)用到的參數(shù)
    private BigDecimal safeLine;        //第三種情況用到的參數(shù)
    private BigDecimal capping;            //第三種情況用到的參數(shù)
    private BigDecimal ladder1Rate;    //第五種情況用到的參數(shù)
    private BigDecimal ladder1Max;//第五種情況用到的參數(shù)
    private BigDecimal ladder2Rate;//第五種情況用到的參數(shù)
    private BigDecimal ladder2Max;//第五種情況用到的參數(shù)
    private BigDecimal ladder3Rate;//第五種情況用到的參數(shù)
    private BigDecimal ladder3Max;//第五種情況用到的參數(shù)
    private BigDecimal ladder4Rate;//第五種情況用到的參數(shù)
    private BigDecimal ladder4Max;//第五種情況用到的參數(shù)
    // 省略部分代碼和getter,setter方法
}

如果分潤規(guī)則改變了,或者增加了新的分潤規(guī)則,這代碼就不知道要怎么維護(hù)了.
因此,基于這種情況,我按照給定的規(guī)則改寫了一下分潤規(guī)則.

改寫后需要達(dá)到的目標(biāo)

修改原有規(guī)則,不會影響到其他規(guī)則

可以能很方便的新增新的分潤規(guī)則

改寫示例

由于該改寫程序只是一個(gè)測試程序,所以涉及的money都是用double,實(shí)際應(yīng)用中,要考慮精度,則需要改為BigDecimal

分潤接口
public interface ProfitRole {
    double getProfit(double money);
}

分潤接口很簡單,就是傳入需要分潤的金額,然后計(jì)算出利潤返回

分潤類型
public enum ProfitType {
    /**
     * 每筆固定收益1元,則填寫代理商收益1.00;
     */
    FIXED_INCOME("^" + ProfitType.realNumber + "$"),
    /**
     * 每筆收益率為0.1%則填寫代理商收益0.1%;
     */
    FIXED_RATE("^"+ ProfitType.rateNumber +"$"),
    /**
     * 每筆收益率為0.1%加上固定收益1元,則填寫代理商收益0.1%+1.00;
     */
    FIXED_RATE_AND_FIXED_INCOME("^"+ ProfitType.rateNumber  + "+" + ProfitType.realNumber + "$"),
    /**
     * 每筆收益率為0.1%,封頂3元,保底1元?jiǎng)t填寫代理商收益1.00~0.1%~3.00;
     */
    FIXED_RATE_AND_UPPER_LIMIT("^"+ ProfitType.realNumber + "~" + ProfitType.rateNumber + "~" + ProfitType.realNumber  + "$"),
    /**
     * 梯度分潤 例如 0.1%<10000<0.2%<20000<0.3%<30000<0.5%
     * 少于10000 按照 0.1% 分潤
     * 少于20000 按照 0.2% 分潤
     * 少于30000 按照 0.3% 分潤
     * 多于30000 按照 0.5% 分潤
     */
    GRADIENT_RATE("^"+ ProfitType.rateNumber+"(<"+ ProfitType.realNumber+"<"+ ProfitType.rateNumber+")+$");

    // 非捕捉匹配正實(shí)數(shù)
    private static final String number = "(?:(?:[1-9]+d*)|(?:d))(?:.d+)?";
    // 捕捉匹配正實(shí)數(shù)
    private static final String realNumber = "(" + number + ")";
    // 捕捉匹配百分比
    private static final String rateNumber = realNumber + "%";

    public static Pattern getNumberPattern(){
        return Pattern.compile(number);
    }
    private String pattern;
    ProfitType(String pattern) {
        this.pattern = pattern;
    }

    public Pattern getPattern() {
        return Pattern.compile(this.pattern);
    }
}

分潤類型是一個(gè)枚舉類,構(gòu)造器參數(shù)是一個(gè)分潤表達(dá)式pattern,

其中ProfitType包含三個(gè)正則表達(dá)式:

number 匹配實(shí)數(shù),但不捕獲

realNumber 匹配實(shí)數(shù),并捕獲該實(shí)數(shù)

rateNumber 匹配百分比,只捕獲實(shí)數(shù),不捕獲百分號

五個(gè)枚舉值分別對應(yīng)五種分潤規(guī)則

FIXED_INCOME : 每筆固定收益1元,則填寫代理商收益1.00

FIXED_RATE : 每筆收益率為0.1%則填寫代理商收益0.1%

FIXED_RATE_AND_FIXED_INCOME : 每筆收益率為0.1%加上固定收益1元,則填寫代理商收益0.1%+1.00

FIXED_RATE_AND_UPPER_LIMIT : 每筆收益率為0.1%,封頂3元,保底1元?jiǎng)t填寫代理商收益1.00~0.1%~3.00

GRADIENT_RATE : 梯度分潤 例如 0.1%<10000<0.2%<20000<0.3%<30000<0.5%

分潤實(shí)現(xiàn)類

目前因?yàn)橛形宸N分潤規(guī)則,每一個(gè)對應(yīng)一個(gè)實(shí)現(xiàn)類,因此有五個(gè)分潤實(shí)現(xiàn)類,與ProfitType的五種分潤規(guī)則一一對應(yīng)

FIXED_INCOME : FixedIncomeRole

FIXED_RATE : FixedRateRole

FIXED_RATE_AND_FIXED_INCOME : FixedRateAndFixedIncomeRole

FIXED_RATE_AND_UPPER_LIMIT : FixedRateAndUpperLimitRole

GRADIENT_RATE : GradientRateRole

分潤實(shí)現(xiàn)類比較簡單,這里就不貼代碼了,有需要的上我[github](https://github.com/kco1989/ma...下載

分潤工廠類

最后在創(chuàng)建一個(gè)工廠,根據(jù)不同的ProfitType和分潤表達(dá)式,創(chuàng)建不同的分潤實(shí)現(xiàn)類

public final class ProfitRoleFactory {

    public static ProfitRole parseProfitRole(ProfitType type, String expression){
        Matcher matcher = type.getPattern().matcher(expression);
        if (!matcher.matches()){
            throw new RuntimeException("分潤表示時(shí)不符合" + type + "的規(guī)則.");
        }
        switch (type){
            case FIXED_INCOME:
                return new FixedIncomeRole(Double.parseDouble(matcher.group(1)));
            case FIXED_RATE:
                return new FixedRateRole(Double.parseDouble(matcher.group(1)));
            case FIXED_RATE_AND_UPPER_LIMIT:
                return new FixedRateAndUpperLimitRole(Double.parseDouble(matcher.group(1)),
                        Double.parseDouble(matcher.group(2)), Double.parseDouble(matcher.group(3)));
            case FIXED_RATE_AND_FIXED_INCOME:
                return new FixedRateAndFixedIncomeRole(Double.parseDouble(matcher.group(1)),
                        Double.parseDouble(matcher.group(2)));
            case GRADIENT_RATE:
                List rates = new ArrayList<>();
                List limits = new ArrayList<>();
                Pattern numberPattern = ProfitType.getNumberPattern();
                Matcher numberMatcher = numberPattern.matcher(expression);
                for (int i = 0;numberMatcher.find();i ++){
                    if (i % 2 == 0){
                        rates.add(Double.parseDouble(numberMatcher.group()));
                    }else{
                        limits.add(Double.parseDouble(numberMatcher.group()));
                    }
                }
                return new GradientRateRole(rates, limits);
            default: //never come here
                return null;
        }
    }

    public static double getProfit(double money, ProfitType type, String expression){
        ProfitRole profitRole = parseProfitRole(type, expression);
        if (profitRole != null){
            return profitRole.getProfit(money);
        }
        return 0;
    }
}
最后創(chuàng)建測試類測試
public class TestProfitRole {

    private static final List testDate = Arrays.asList(100.0,200.0,300.0,400.0,700.0,
            1000.0,2000.0,3000.0,7000.0,
            10000.0, 20000.0, 30000.0, 70000.0);
    @Test
    public void testFixedIncome(){
        for (double data : testDate){
            double profit = ProfitRoleFactory.getProfit(data, ProfitType.FIXED_INCOME, "1.00");
            Assert.assertEquals(1.00, profit, 0.00001);
        }
    }

    @Test
    public void testFixedRate(){
        for (double data : testDate){
            double profit = ProfitRoleFactory.getProfit(data, ProfitType.FIXED_RATE, "0.1%");
            Assert.assertEquals(data * 0.1 * 0.01, profit, 0.00001);
        }
    }

    @Test
    public void testFixedRateAndFixedIncome(){
        for (double data : testDate){
            double profit = ProfitRoleFactory.getProfit(data, ProfitType.FIXED_RATE_AND_FIXED_INCOME, "0.63%+3.00");
            Assert.assertEquals(data * 0.63 * 0.01 + 3.0, profit, 0.00001);
        }
    }

    @Test
    public void testFixedRateAndUpperLimit(){
        for (double data : testDate){
            double profit = ProfitRoleFactory.getProfit(data, ProfitType.FIXED_RATE_AND_UPPER_LIMIT, "1.00~0.1%~3.00");
            double actual = data * 0.1 * 0.01;
            if (actual < 1.0){
                actual = 1.0;
            }
            if (actual > 3.0){
                actual = 3.0;
            }
            Assert.assertEquals(actual, profit, 0.00001);
        }
    }

    @Test
    public void testGradientRate(){
        for (double data : testDate){
            double profit = ProfitRoleFactory.getProfit(data, ProfitType.GRADIENT_RATE, "0.1%<1000<0.2%<5000<0.3%<15000<0.5%");
            if (data < 1000){
                Assert.assertEquals(data * 0.01 * 0.1, profit, 0.00001);
            }else if (data < 5000){
                Assert.assertEquals(data * 0.01 * 0.2, profit, 0.00001);
            }else if(data < 15000){
                Assert.assertEquals(data * 0.01 * 0.3, profit, 0.00001);
            }else{
                Assert.assertEquals(data * 0.01 * 0.5, profit, 0.00001);
            }
        }
    }
}
后記

現(xiàn)在回顧一下我們的目標(biāo),我們的目標(biāo)是:

修改原有規(guī)則,不會影響到其他規(guī)則

可以能很方便的新增新的分潤規(guī)則

目標(biāo)1是達(dá)成了,但是目標(biāo)2卻有點(diǎn)差強(qiáng)人意.比如要新增一個(gè)分潤規(guī)則的話,除了新增分潤實(shí)現(xiàn)類外,還需要同時(shí)改ProfitTypeProfitRoleFactory類,沒有達(dá)到完全解耦.但相對之前的代碼還有有改進(jìn)的.

這個(gè)問題先留個(gè)各位練習(xí),后續(xù)有時(shí)間我再對該程序進(jìn)行改進(jìn).

現(xiàn)在已經(jīng)解決這個(gè)問題,已經(jīng)達(dá)到完全解耦了,詳情見使用抽象工廠模式實(shí)現(xiàn)各種不同分潤規(guī)則

打賞

如果覺得我的文章寫的還過得去的話,有錢就捧個(gè)錢場,沒錢給我捧個(gè)人場(幫我點(diǎn)贊或推薦一下)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67062.html

相關(guān)文章

  • 使用工廠方法模式實(shí)現(xiàn)各種不同分潤規(guī)則

    摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言在上一篇文章中使用簡單工廠編寫不同的分潤規(guī)則遺留著一個(gè)問題那就是如果要新增分潤規(guī)則則需要修改原來的類也就是代碼沒有完全解耦因此在這一篇中我將分潤規(guī)則的設(shè)計(jì)改為抽象工廠模式 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    junbaor 評論0 收藏0
  • 數(shù)據(jù)可用不可見!揭秘螞蟻區(qū)塊鏈摩斯安全計(jì)算平臺

    摘要:安全透明輕量的螞蟻區(qū)塊鏈摩斯安全計(jì)算基礎(chǔ)設(shè)施螞蟻摩斯依托螞蟻金融科技平臺,結(jié)合區(qū)塊鏈技術(shù),將復(fù)雜的隱私保護(hù)與密碼學(xué)算法透明化產(chǎn)品化,提供安全發(fā)布安全模型安全統(tǒng)計(jì)安全查詢安全腳本等核心功能。 摘要:?螞蟻區(qū)塊鏈摩斯安全計(jì)算平臺針對數(shù)據(jù)安全信任、個(gè)人隱私保護(hù)以及數(shù)據(jù)基礎(chǔ)設(shè)施不足等痛點(diǎn),秉持?jǐn)?shù)據(jù)可用不可見和將計(jì)算移動(dòng)到數(shù)據(jù)端的原則,借助區(qū)塊鏈、密碼學(xué)、隱私保護(hù)、安全多方計(jì)算、可信計(jì)算等前沿...

    zhisheng 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<