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

資訊專欄INFORMATION COLUMN

使用工廠方法模式實現各種不同分潤規則

junbaor / 3450人閱讀

摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言在上一篇文章中使用簡單工廠編寫不同的分潤規則遺留著一個問題那就是如果要新增分潤規則則需要修改原來的類也就是代碼沒有完全解耦因此在這一篇中我將分潤規則的設計改為抽象工廠模式

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

引言

在上一篇文章中使用簡單工廠編寫不同的分潤規則遺留著一個問題,那就是如果要新增分潤規則,則需要修改原來的類.也就是代碼沒有完全解耦.
因此在這一篇中,我將分潤規則的設計改為抽象工廠模式來編寫.以解決上次遺留的問題.

改寫示例 分潤規則接口類

該類與上一篇是一樣的.

public interface ProfitRole {
    double getProfit(double money);
}
分潤規則抽象工廠類
public abstract class ProfitRoleFactory {

    public static ProfitRole createProfitRole(String profitTypeName, String expression){
        ProfitType profitType = ProfitType.getProfitType(profitTypeName);
        Matcher matcher = profitType.getPattern().matcher(expression);
        if (!matcher.matches()){
            throw new RuntimeException("分潤表示時不符合" + profitType.getName() + "的規則.");
        }
        return profitType.getFactory().newProfitRole(profitType, matcher, expression);
    }

    protected abstract ProfitRole newProfitRole(ProfitType profitType, Matcher matcher, String expression);


}

該類主要提供一個統一的接口ProfitRoleFactory.createProfitRole創建分潤規則實現類
每一個分潤規則實現類對應一個分潤規則工廠類,由分潤規則工廠類來創建出分潤規則對象
再由分潤規則對象實現具體的分潤細節

分潤規則類型

上一篇使用到的枚舉類型.但是java不支持動態增加枚舉成員.所以如果這一篇還是使用枚舉類型的話,則在增加新的分潤規則時難免需要修改該枚舉類型.
因此,這一篇不是枚舉類型.

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

    // 分潤規則map
    private static final Map profitTypeMap = new HashMap<>();
    static {
        ProfitType.registerProfitRole("FIXED_RATE",
                "^"+ ProfitType.rateNumber +"$",
                new FixedRateRoleFactory(),
                "每筆收益率為0.1%則填寫代理商收益0.1%;");

        ProfitType.registerProfitRole("FIXED_INCOME",
                "^" + ProfitType.realNumber + "$",
                new FixedIncomeRoleFactory(),
                "每筆固定收益1元,則填寫代理商收益1.00");

        ProfitType.registerProfitRole("FIXED_RATE_AND_FIXED_INCOME",
                "^"+ ProfitType.rateNumber  + "+" + ProfitType.realNumber + "$",
                new FixedRateAndFixedIncomeRoleFactory(),
                "每筆收益率為0.1%加上固定收益1元,則填寫代理商收益0.1%+1.00");

        ProfitType.registerProfitRole("FIXED_RATE_AND_UPPER_LIMIT",
                "^"+ ProfitType.realNumber + "~" + ProfitType.rateNumber + "~" + ProfitType.realNumber  + "$",
                new FixedRateAndUpperLimitRoleFactory(),
                "每筆收益率為0.1%,封頂3元,保底1元則填寫代理商收益1.00~0.1%~3.00;");

        ProfitType.registerProfitRole("GRADIENT_RATE",
                "^"+ ProfitType.rateNumber+"(<"+ ProfitType.realNumber+"<"+ ProfitType.rateNumber+")+$",
                new GradientRateRoleFactory(),
                "梯度分潤 例如 0.1%<10000<0.2%<20000<0.3%<30000<0.5%");
    }
    
    private String name;
    private String expression;
    private String description;
    private ProfitRoleFactory factory;

    public ProfitType(String name, String expression, ProfitRoleFactory factory, String description) {
        this.name = name;
        this.expression = expression;
        this.factory = factory;
        this.description = description;
    }

    public static Pattern getNumberPattern() {
        return Pattern.compile(number);
    }

    public String getName() {
        return name;
    }

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

    /**
     * 注冊分潤規則類型
     */
    public static void registerProfitRole(String name, String profitRoleExpression,ProfitRoleFactory factory, String description){
        if (profitTypeMap.containsKey(name)){
            throw new RuntimeException("該"+name+"分潤規則已經存在");
        }
        profitTypeMap.put(name, new ProfitType(name, profitRoleExpression, factory, description));
    }

    public ProfitRoleFactory getFactory() {
        return factory;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 根據分潤規則名字獲取分潤規則類型
     */
    public static ProfitType getProfitType(String name){
        return profitTypeMap.get(name);
    }

    public static String getProfitTypeInfo(){
        StringBuilder sb = new StringBuilder();
        for (Map.Entry entry : profitTypeMap.entrySet()){
            sb.append(entry.getKey() + " --> " + entry.getValue().getDescription() + "
");
        }
        return sb.toString();
    }
}

ProfitType.profitTypeMap 存放分潤類型名稱和分潤類型的key-value值
ProfitType.registerProfitRole 提供一個注冊分潤類型的借口
ProfitType static域 默認增加上一篇提到的5種分潤規則

分潤規則工廠類和分潤規則實現類

目前提供五種分潤規則:

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

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

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

每筆收益率為0.1%,封頂3元,保底1元則填寫代理商收益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% 分潤

分別對應于分潤規則工廠類 -> 分潤規則實現類:

FixedIncomeRoleFactory -> FixedIncomeRole

FixedRateRoleFactory -> FixedRateRole

FixedRateAndFixedIncomeRoleFactory -> FixedRateAndFixedIncomeRole

FixedRateAndUpperLimitRoleFactory -> FixedRateAndUpperLimitRole

GradientRateRoleFactory -> GradientRateRole

實現新的分潤規則

如果需要實現新的分潤規則,則分別編寫一個分潤規則工廠類和分潤規則實現類,使其實分別繼承(/實現)ProfitRoleFactoryProfitRole,然后再調用ProfitType.registerProfitRole注冊一下新的分潤規則就萬事大吉了.不需要修改原有的代碼.也就是實現了完全解耦.

測試類
public class TestProfitRole2 {

    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 test(){
        String profitTypeInfo = ProfitType.getProfitTypeInfo();
        System.out.println(profitTypeInfo);

    }
    @Test
    public void testFixedIncome(){
        for (double data : testDate){
            ProfitRole fixedIncome = ProfitRoleFactory.createProfitRole("FIXED_INCOME", "1.00");
            double profit = fixedIncome.getProfit(data);
            Assert.assertEquals(1.00, profit, 0.00001);
        }
    }

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

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

    @Test
    public void testFixedRateAndUpperLimit(){
        for (double data : testDate){
            ProfitRole profitRole = ProfitRoleFactory.createProfitRole("FIXED_RATE_AND_UPPER_LIMIT", "1.00~0.1%~3.00");
            double profit = profitRole.getProfit(data);
            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){
            ProfitRole profitRole = ProfitRoleFactory.createProfitRole("GRADIENT_RATE", "0.1%<1000<0.2%<5000<0.3%<15000<0.5%");
            double profit = profitRole.getProfit(data);
            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);
            }
        }
    }
}
打賞

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67061.html

相關文章

  • 使用簡單工廠編寫不同分潤規則

    摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言在工作項目中遇到以下一個問題公司有一款產品遇到給不同代理商代理售賣但是不同的代理商分潤的方式各自不同有以下幾個中分潤方式每筆固定收益元,則填寫代理商收益每筆收益率為則填寫 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    Lucky_Boy 評論0 收藏0
  • 理解設計模式

    摘要:適配器模式將一個類的接口轉換成客戶希望的另外一個接口。代理模式為其他對象提供一種代理以控制對這個對象的訪問。如果用來解決排序問題不符合開閉原則,添加策略需要修改代碼用策略模式將策略抽象成接口,不同的策略實現該接口。 簡單工廠、工廠方法、抽象工廠 簡單工廠 通過定義多個factory.produceXXX()方法,或者通過向factory.produce(type)傳遞type參數來生成...

    saucxs 評論0 收藏0
  • 準備接入個人支付接口?看完這幾款支付產品再做決定!

    摘要:支持的付款方式主打銀聯信用卡等,付款可以及時到賬。支持的付款方式主要是微信支付寶和京東支付。支持微信支付寶掃碼支付。 最近在開發自己的網站,想要接入一個第三方的支付平臺,但是處在創業初期,還沒能成立公司,所以沒有企業資質,想接入一款安全且性價比高的收款產品。以本人選擇困難癥再加點小糾結的個性,對現有的一些第三方支付接口做了一個對比,希望能給有相同需要的和正在尋求相關解決方案的朋友提供一...

    SimonMa 評論0 收藏0
  • 準備接入個人支付接口?看完這幾款支付產品再做決定!

    摘要:支持的付款方式主打銀聯信用卡等,付款可以及時到賬。支持的付款方式主要是微信支付寶和京東支付。支持微信支付寶掃碼支付。 最近在開發自己的網站,想要接入一個第三方的支付平臺,但是處在創業初期,還沒能成立公司,所以沒有企業資質,想接入一款安全且性價比高的收款產品。以本人選擇困難癥再加點小糾結的個性,對現有的一些第三方支付接口做了一個對比,希望能給有相同需要的和正在尋求相關解決方案的朋友提供一...

    livem 評論0 收藏0

發表評論

0條評論

junbaor

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<