摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言在上一篇文章中使用簡單工廠編寫不同的分潤規(guī)則遺留著一個問題那就是如果要新增分潤規(guī)則則需要修改原來的類也就是代碼沒有完全解耦因此在這一篇中我將分潤規(guī)則的設(shè)計改為抽象工廠模式
引言本人郵箱:
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經(jīng)全部托管github有需要的同學(xué)自行下載
在上一篇文章中使用簡單工廠編寫不同的分潤規(guī)則遺留著一個問題,那就是如果要新增分潤規(guī)則,則需要修改原來的類.也就是代碼沒有完全解耦.
因此在這一篇中,我將分潤規(guī)則的設(shè)計改為抽象工廠模式來編寫.以解決上次遺留的問題.
該類與上一篇是一樣的.
public interface ProfitRole { double getProfit(double money); }分潤規(guī)則抽象工廠類
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() + "的規(guī)則."); } return profitType.getFactory().newProfitRole(profitType, matcher, expression); } protected abstract ProfitRole newProfitRole(ProfitType profitType, Matcher matcher, String expression); }
分潤規(guī)則類型該類主要提供一個統(tǒng)一的接口ProfitRoleFactory.createProfitRole創(chuàng)建分潤規(guī)則實現(xiàn)類
每一個分潤規(guī)則實現(xiàn)類對應(yīng)一個分潤規(guī)則工廠類,由分潤規(guī)則工廠類來創(chuàng)建出分潤規(guī)則對象
再由分潤規(guī)則對象實現(xiàn)具體的分潤細(xì)節(jié)
上一篇使用到的枚舉類型.但是java不支持動態(tài)增加枚舉成員.所以如果這一篇還是使用枚舉類型的話,則在增加新的分潤規(guī)則時難免需要修改該枚舉類型.
因此,這一篇不是枚舉類型.
public class ProfitType { // 非捕捉匹配正實數(shù) public static final String number = "(?:(?:[1-9]+d*)|(?:d))(?:.d+)?"; // 捕捉匹配正實數(shù) public static final String realNumber = "(" + number + ")"; // 捕捉匹配百分比 public static final String rateNumber = realNumber + "%"; // 分潤規(guī)則map private static final MapprofitTypeMap = 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); } /** * 注冊分潤規(guī)則類型 */ public static void registerProfitRole(String name, String profitRoleExpression,ProfitRoleFactory factory, String description){ if (profitTypeMap.containsKey(name)){ throw new RuntimeException("該"+name+"分潤規(guī)則已經(jīng)存在"); } profitTypeMap.put(name, new ProfitType(name, profitRoleExpression, factory, description)); } public ProfitRoleFactory getFactory() { return factory; } public String getDescription() { return description; } /** * 根據(jù)分潤規(guī)則名字獲取分潤規(guī)則類型 */ 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(); } }
分潤規(guī)則工廠類和分潤規(guī)則實現(xiàn)類ProfitType.profitTypeMap 存放分潤類型名稱和分潤類型的key-value值
ProfitType.registerProfitRole 提供一個注冊分潤類型的借口
ProfitType static域 默認(rèn)增加上一篇提到的5種分潤規(guī)則
目前提供五種分潤規(guī)則:
每筆固定收益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% 分潤
分別對應(yīng)于分潤規(guī)則工廠類 -> 分潤規(guī)則實現(xiàn)類:
FixedIncomeRoleFactory -> FixedIncomeRole
FixedRateRoleFactory -> FixedRateRole
FixedRateAndFixedIncomeRoleFactory -> FixedRateAndFixedIncomeRole
FixedRateAndUpperLimitRoleFactory -> FixedRateAndUpperLimitRole
GradientRateRoleFactory -> GradientRateRole
實現(xiàn)新的分潤規(guī)則如果需要實現(xiàn)新的分潤規(guī)則,則分別編寫一個分潤規(guī)則工廠類和分潤規(guī)則實現(xiàn)類,使其實分別繼承(/實現(xiàn))ProfitRoleFactory和ProfitRole,然后再調(diào)用ProfitType.registerProfitRole注冊一下新的分潤規(guī)則就萬事大吉了.不需要修改原有的代碼.也就是實現(xiàn)了完全解耦.
測試類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); } } } }
如果覺得我的文章寫的還過得去的話,有錢就捧個錢場,沒錢給我捧個人場(幫我點贊或推薦一下)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67061.html
摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言在工作項目中遇到以下一個問題公司有一款產(chǎn)品遇到給不同代理商代理售賣但是不同的代理商分潤的方式各自不同有以下幾個中分潤方式每筆固定收益元,則填寫代理商收益每筆收益率為則填寫 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github...
摘要:適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。代理模式為其他對象提供一種代理以控制對這個對象的訪問。如果用來解決排序問題不符合開閉原則,添加策略需要修改代碼用策略模式將策略抽象成接口,不同的策略實現(xiàn)該接口。 簡單工廠、工廠方法、抽象工廠 簡單工廠 通過定義多個factory.produceXXX()方法,或者通過向factory.produce(type)傳遞type參數(shù)來生成...
摘要:支持的付款方式主打銀聯(lián)信用卡等,付款可以及時到賬。支持的付款方式主要是微信支付寶和京東支付。支持微信支付寶掃碼支付。 最近在開發(fā)自己的網(wǎng)站,想要接入一個第三方的支付平臺,但是處在創(chuàng)業(yè)初期,還沒能成立公司,所以沒有企業(yè)資質(zhì),想接入一款安全且性價比高的收款產(chǎn)品。以本人選擇困難癥再加點小糾結(jié)的個性,對現(xiàn)有的一些第三方支付接口做了一個對比,希望能給有相同需要的和正在尋求相關(guān)解決方案的朋友提供一...
摘要:支持的付款方式主打銀聯(lián)信用卡等,付款可以及時到賬。支持的付款方式主要是微信支付寶和京東支付。支持微信支付寶掃碼支付。 最近在開發(fā)自己的網(wǎng)站,想要接入一個第三方的支付平臺,但是處在創(chuàng)業(yè)初期,還沒能成立公司,所以沒有企業(yè)資質(zhì),想接入一款安全且性價比高的收款產(chǎn)品。以本人選擇困難癥再加點小糾結(jié)的個性,對現(xiàn)有的一些第三方支付接口做了一個對比,希望能給有相同需要的和正在尋求相關(guān)解決方案的朋友提供一...
閱讀 1644·2023-04-25 18:19
閱讀 2086·2021-10-26 09:48
閱讀 1093·2021-10-09 09:44
閱讀 1743·2021-09-09 11:35
閱讀 3035·2019-08-30 15:54
閱讀 2032·2019-08-30 11:26
閱讀 2296·2019-08-29 17:06
閱讀 892·2019-08-29 16:38