打字猴:1.700482154e+09
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 ]  [ 下一页 ]