1700482204
1700482205
//自由扣款
1700482206
1700482207
public boolean exec(Card card,Trade trade){
1700482208
1700482209
//直接从自由余额中扣除
1700482210
1700482211
card.setFreeMoney(card.getFreeMoney()-trade.getAmount());
1700482212
1700482213
return true;
1700482214
1700482215
}
1700482216
1700482217
}
1700482218
1700482219
卡内的自由金额减去交易金额再修改卡内自由金额就完事了,异常情况不考虑。这两个具体的策略与我们的交易类型没有任何关系,也不应该有关系,策略模式就是提供两个可以相互替换的策略,至于在什么时候使用什么策略,则不是由策略模式来决定的。策略模式还有一个角色没出场,即封装角色,如代码清单35-6所示。
1700482220
1700482221
代码清单35-6 扣款策略的封装
1700482222
1700482223
public class DeductionContext{
1700482224
1700482225
//扣款策略
1700482226
1700482227
private IDeduction deduction=null;
1700482228
1700482229
//构造函数传递策略
1700482230
1700482231
public DeductionContext(IDeduction_deduction){
1700482232
1700482233
this.deduction=_deduction;
1700482234
1700482235
}
1700482236
1700482237
//执行扣款
1700482238
1700482239
public boolean exec(Card card,Trade trade){
1700482240
1700482241
return this.deduction.exec(card,trade);
1700482242
1700482243
}
1700482244
1700482245
}
1700482246
1700482247
典型的策略上下文角色。扣款模块的策略已经定义完毕了,然后需要想办法解决策略模式的缺陷:它把所有的策略类都暴露出去,暴露得越多以后的修改风险也就越大。怎么修改呢?增加一个映射配置文件,实现策略类的隐藏。我们使用枚举担当此任,对策略类进行映射处理,避免高层模块直接访问策略类,同时由工厂方法模式根据映射产生策略对象,类图如图35-3所示。
1700482248
1700482249
1700482250
1700482251
1700482252
图35-3 策略工厂类图
1700482253
[
上一页 ]
[ :1.700482204e+09 ]
[
下一页 ]