1700482154
}
1700482155
1700482156
两个最简单也是在应用中最常使用的对象定义完毕,下面就需要来定义策略了,非常明显的策略模式,类图如图35-2所示。
1700482157
1700482158
1700482159
1700482160
1700482161
图35-2 扣款策略类图
1700482162
1700482163
典型的策略模式,扣款有两种策略:固定扣款和自由扣款。下面我们来看代码,先看抽象策略,也就是扣款接口,如代码清单35-3所示。
1700482164
1700482165
代码清单35-3 扣款策略接口
1700482166
1700482167
public interface IDeduction{
1700482168
1700482169
//扣款,提供交易和卡信息,进行扣款,并返回扣款是否成功
1700482170
1700482171
public boolean exec(Card card,Trade trade);
1700482172
1700482173
}
1700482174
1700482175
固定扣款的规则是固定金额和自由金额各扣除交易金额的一半,如代码清单35-4所示。
1700482176
1700482177
代码清单35-4 扣款策略一
1700482178
1700482179
public class SteadyDeduction implements IDeduction{
1700482180
1700482181
//固定性交易扣款
1700482182
1700482183
public boolean exec(Card card,Trade trade){
1700482184
1700482185
//固定金额和自由金额各扣除50%
1700482186
1700482187
int halfMoney=(int)Math.rint(trade.getAmount()/2.0);
1700482188
1700482189
card.setFreeMoney(card.getFreeMoney()-halfMoney);
1700482190
1700482191
card.setSteadyMoney(card.getSteadyMoney()-halfMoney);
1700482192
1700482193
return true;
1700482194
1700482195
}
1700482196
1700482197
}
1700482198
1700482199
这个具体策略也非常简单,就是两个金额各自减去交易额的一半(注意除数是2.0,可不是2),然后再四舍五入,算法确实简单。该逻辑没有考虑账户余额不足的情况,也没有考虑异常情况,比如并发情况,读者可以想想看,一张卡有两笔消费同时发生时,是不是就发生错误了?一张卡同时有两笔消费会出现这种情况吗?会的,网络阻塞的情况,MQ多通道发送,在网络繁忙的情况下是有可能出现该问题,这里就不多介绍,有兴趣的读者可以看看MQ的资料。我们在这里的讲解实现的是一个快乐路径,认为所有的交易都是在安全可靠的环境中发生的,并且所有的系统环境都满足我们的要求。我们再来看另一个策略,这个策略更简单,如代码清单35-5所示。
1700482200
1700482201
代码清单35-5 扣款策略二
1700482202
1700482203
public class FreeDeduction implements IDeduction{
[
上一页 ]
[ :1.700482154e+09 ]
[
下一页 ]