getDeduction(reg);
//产生一个策略上下文
DeductionContext context = new DeductionContext(deduction);
//进行扣款处理
context.exec(card, trade);
//返回扣款处理完毕后的数据
return card;
//获得对应的商户消费策略
private static StrategyMan getDeductionType(Trade trade) {
//模拟操作
if(trade.getTradeNo().contains("abc")) {
return StrategyMan.FreeDeduction;
}else {
return StrategyMan.SteadyDeduction;
这次为什么要先展示代码而后写类图呢?那是因为这段代码比写类图更能让你理解。读者注意一下getDeductionType方法,这个方法在实际项目中是存在的,但是与上面的写法有天壤之别,因为在实际项目中,数据库中保存了策略代码与交易编码的对应关系,直接通过数据库的SQL语句就可以返回对应的扣款策略。这里我们采用大家最熟悉的条件转移来实现,也是比较清晰和容易理解的。
可能读者要问了,在门面模式中已经明确地说明,门面类中不允许有业务逻辑存在,但是你这里还是有了一个getDeductionType方法,它可代表的是一个判断逻辑呀,这是为什么呢?是的,该方法完全可以移到其他Hepler类中,由于我们是示例代码,暂没有明确的业务含义,故编写在此处,读者在实际应用中,请把该方法放置到其他类中。
好,所有用到的模式都介绍完毕了,我们把完整的类图整理一下,如图35-4所示。
图35-4 扣款子模块完整类图
真实系统比这复杂得多,有了我们之前的分析,这个图还是比较容易看懂的。我们所有的开发都完成了,是不是应该写一个测试类来展示一下我们的成果,如代码清单35-10所示。
代码清单35-10 场景类
public class Client {
//模拟交易
public static void main(String[] args) {
//初始化一张IC卡
Card card = initIC();
//显示一下卡内信息
System.out.println("========初始卡信息:=========");
showCard(card);
//是否停止运行标志
boolean flag = true;
while(flag) {
Trade trade = createTrade();
DeductionFacade.deduct(card, trade);
//交易成功,打印出成功处理消息System.out.println("
======交易凭证========");
System.out.println(trade.getTradeNo()+" 交易成功!");
System.out.println("本次发生的交易金额为:"+trade.getAmount()/100.0+"元");
//展示一下卡内信息
showCard(card);
System.out.print("
是否需要退出?(Y/N)");
if(getInput().equalsIgnoreCase("y")) {
flag = false;
//退出
//初始化一个IC卡
private static Card initIC() {
Card card = new Card();
card.setCardNo("1100010001000");
card.setFreeMoney(100000);
//1000元card.setSteadyMoney(80000);
//800元
return card;
//产生一条交易
private static Trade createTrade() {
Trade trade = new Trade();
System.out.print("请输入交易编号:");
trade.setTradeNo(getInput());
System.out.print("请输入交易金额:");
trade.setAmount(Integer.parseInt(getInput()));
//返回交易
return trade;
//打印出当前卡内交易余额
public static void showCard(Card card) {
System.out.println("IC卡编号:" + card.getCardNo());
System.out.println("固定类型余额:"+ card.ge
更多内容加载中...请稍候...
若您看到此段落,代表章节内容加载失败,请关闭浏览器的阅读模式、畅读模式、小说模式,以及关闭广告屏蔽功能,或复制网址到其他浏览器阅读!