所示。
代码清单35-1 IC卡类
public class Card {
//IC卡号码
private String cardNo="";
//卡内的固定交易金额
private int steadyMoney =0;
//卡内自由交易金额
private int freeMoney =0;
//getter/setter方法
public String getCardNo() {
return cardNo;
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
public int getSteadyMoney() {
return steadyMoney;
public void setSteadyMoney(int steadyMoney) {
this.steadyMoney = steadyMoney;
public int getFreeMoney() {
return freeMoney;
public void setFreeMoney(int freeMoney) {
this.freeMoney = freeMoney;
细心的读者可能注意到,金额怎么都是整数类型呀,应该是double类型或者BigDecimal类型呀。是,一般非银行的交易系统,比如超市的收银系统,系统内都是存放的int类型,在显示的时候才转换为货币类型。
交易信息Trade类,负责记录每一笔交易,它是由监听程序监听MQ队列而产生的,有两个属性:交易编号和交易金额,其中的交易编号对整个交易非常重要,18位字符(在银行的交易系统中,这里可不是字符串,一般是十进制数字或二进制数字,要考虑系统的性能,数字运算可比字符运算快得多),包括POS机编号、商户编号、校验码等,我们这里暂时用不到,就不多做介绍,我们只要知道它是一个非常有用的编码就成。交易金额为整数类型,实际金额放大100倍即可。如代码清单35-2所示。
代码清单35-2 交易类
public class Trade {
//交易编号
private String tradeNo = "";
//交易金额
private int amount = 0;
//getter/setter方法
public String getTradeNo() {
return tradeNo;
public void setTradeNo(String postNo) {
this.tradeNo = postNo;
public int getAmount() {
return amount;
public void setAmount(int amount) {
this.amount = amount;
两个最简单也是在应用中最常使用的对象定义完毕,下面就需要来定义策略了,非常明显的策略模式,类图如图35-2所示。
典型的策略模式,扣款有两种策略:固定扣款和自由扣款。下面我们来看代码,先看抽象策略,也就是扣款接口,如代码清单35-3所示。
代码清单35-3 扣款策略接口
public interface IDeduction {
//扣款,提供交易和卡信息,进行扣款,并返回扣款是否成功
public boolean exec(Card card,Trade trade);
固定扣款的规则是固定金额和自由金额各扣除交易金额的一半,如代码清单35-4所示。
代码清单35-4 扣款策略一
public class SteadyDeduction implements IDeduction {
//固定性交易扣款
public boolean exec(Card card, Trade trade) {
//固定金额和自由金额各扣除50%int halfMoney = (int)Math.rint(trade.getAmount() / 2.0);
card.setFreeMoney(card.getFreeMoney() - halfMoney);
card.setSteadyMoney(card.getSteadyMoney() - halfMoney);
return true;
图35-2 扣款策略类图
这个具体策略也非常简单,就是两个金额各自减去交易额的一半(注意除数是2.0,可不是2),然后再四舍五入,算法确实简单。该逻辑没有考虑账户余额不足的情况,也没有考虑异常情况,比如并发情况,读者可以想想看,一张卡有两笔消费同时发生时,是不是就发生错误了?一张卡同时有两笔消费会出现这种情况吗?会的,网络阻塞的情况,MQ多通道发送,在网络繁忙的情况下是有可能出现该问题,这里就不多
更多内容加载中...请稍候...
若您看到此段落,代表章节内容加载失败,请关闭浏览器的阅读模式、畅读模式、小说模式,以及关闭广告屏蔽功能,或复制网址到其他浏览器阅读!