- 首先在阐述需求之前对一些名词做点解释:
- 商户编号:有使用过POS机刷卡的同学,可能都会注意到POS签购单上有一个商户编号,这个编号有15位,前三位代表收单银行,第四位到第七位代表行政区划代码,第八位到第十一位代表商户类型代码及MCC码,最后四位就没什么特殊的了。
- 手续费:每一笔订单都会产生一笔手续费,从结算给商户的金额中扣取,和刷卡的客户无太多关系,一般按发卡行:收单机构:银联的比例为7:3:1或者8:1:1进行清分。
- 扣率:费率根据商户的类型(MCC)不同而不同,现在民生类的是0.38%的手续费,一般类是0.78%,餐娱类是1.25%。
- 订单:订单就是订单啦,应该没人不理解啦。
- 然后描述需求:
现在针对每一笔订单,都会关联到一个商户;每一个商户关联一个固定商户编号;每个商户编号有不同的扣率。比如:1、按每笔收取固定手续费,没交易一笔订 单,收取5角;2、按百分比收取手续费,比如民生类商户按0.38%收取手续费,封顶金额16元;3、按不同交易金额区间收取不同的手续费,比如 0~5000收取每笔订单1元,5000~50000收取每笔订单5角,大于50000收取每笔订单2角;4、不同交易金额区间按不同百分比收取手续费等 等。
- 具体设计不做赘述,直接上类图:
策略接口StrategyCharge定义了一个计算手续费的方法,有四个实现类StrategyWithCount、StrategyWithCountByStage、StrategyWithRatio和StrategyWithRatioByStage,顾名思义,这四个类分别负责计算1每笔收取固定手续费、2每笔按不同金额区间收取不同手续费、3每笔按固定百分比收取手续费和4每笔按不同金额区间根据不同百分比收取手续的计算。
- 所有类的代码如下:
package src.designpattern.strategy.ex2.model; /** * 扣率实体 * * @author wusj * @time 2015年8月10日 上午11:23:06 */ public class DeductionRate { private String id; /** * 资金范围开始值 */ private String rangeBottom; /** * 资金范围结束值 */ private String rangeTop; /** * 扣率,(0,1)之间表示百分比,大于等于1表示每交易扣款金额(单位为分) */ private String ratio; /** * 最大值 */ private String maximum; /** * 最小值 */ private String minimum; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getRangeBottom() { return rangeBottom; } public void setRangeBottom(String rangeBottom) { this.rangeBottom = rangeBottom; } public String getRangeTop() { return rangeTop; } public void setRangeTop(String rangeTop) { this.rangeTop = rangeTop; } public String getRatio() { return ratio; } public void setRatio(String ratio) { this.ratio = ratio; } public String getMaximum() { return maximum; } public void setMaximum(String maximum) { this.maximum = maximum; } public String getMinimum() { return minimum; } public void setMinimum(String minimum) { this.minimum = minimum; } }
package src.designpattern.strategy.