内容简介:迷你版的交易系统,最最最最简单的。。卡上有两个账户,分别是自有账户,和固定账户,简化为自由余额,固定余额,两种余额方式。扣款有两种方式
简介
迷你版的交易系统,最最最最简单的。。
扣款子模块
卡上有两个账户,分别是自有账户,和固定账户,简化为自由余额,固定余额,两种余额方式。
扣款有两种方式
扣款方式一
两个账户同时扣款一半。
固定余额 = 固定余额 - 交易金额/2
自由余额 = 自由金额 - 交易金额/2
即,各自扣除一半
扣款方式二
全部从自由金额上扣除。
简单复习
策略模式
扣款可以使用策略模式进行扣款。
策略模式是把原先耦合的if拆分成为类,把条件通过注入的方式,达到条件模式。
状态模式,责任链模式
交易扣款的模式是固定的,要根据交易编号来定,交易编号和扣款策略如何对应,使用责任链和状态模式。
UML
代码如下
package ming.Deduction;
import ming.entity.*;
// 扣款
public class DeductionContext {
// 扣款
private IDeduction deduction = null;
// 传递
public DeductionContext(IDeduction _deduction){
this.deduction = _deduction;
}
// 执行扣款
public boolean exec(Card card, Trade trade){
return this.deduction.exec(card, trade);
}
}
package ming.Deduction;
import ming.entity.*;
// 对扣款模块进行封装
public class DeductionFacade {
// 扣款信息公布
public static Card deduct(Card card, Trade trade){
// 获得消费策略,进行那种消费,实现那种扣款方式
StrategyMan reg = getDeductionType(trade);
// 初始化对象
IDeduction deduction = StrategyFactory.getDeduction(reg);
// 获取扣款上下文
DeductionContext context = new DeductionContext(deduction);
// 进行扣款
context.exec(card, trade);
// 返回数据
return card;
}
// 获得对应的商户的消费,即从配置文件中获取那个进行消费
// 根据交易码进行选择那种扣款方式,交易码是18位的
private static StrategyMan getDeductionType(Trade trade) {
String trandeNo = new String(trade.getTradeNo());
// 模块操作
if(trandeNo.contains("010")){
return StrategyMan.FreeDeduction;
}else{
return StrategyMan.SteadyDeduction;
}
}
}
package ming.Deduction;
import ming.entity.*;
// 自由扣款
public class FreeDeduction implements IDeduction {
// 自由扣款
@Override
public synchronized boolean exec(Card card, Trade trade) {
int freeDeduction = card.getFreeMoney() - trade.getAmout();
if(freeDeduction < 0){
return false;
}
card.setFreeMoney(freeDeduction);
return true;
}
}
package ming.Deduction;
import ming.entity.*;
// 扣款策略接口
public interface IDeduction {
// 扣款
public boolean exec(Card card, Trade trade);
}
package ming.Deduction;
import ming.entity.*;
// 固定扣款方式
public class SteadyDeduction implements IDeduction{
// 固定扣款
@Override
public synchronized boolean exec(Card card, Trade trade) {
int halfMoney = (int)Math.rint(trade.getAmout() / 2.0);
int freeMoney = card.getFreeMoney() - halfMoney;
// 余额不足
if(freeMoney < 0){
return false;
}
int stateMoney = card.getSteadyMoney() - halfMoney;
// 额度不足
if(stateMoney < 0){
return false;
}
// 扣款
card.setSteadyMoney(stateMoney);
card.setFreeMoney(freeMoney);
return true;
}
}
package ming.Deduction;
// 策略工厂
public class StrategyFactory {
public static IDeduction getDeduction(StrategyMan strategyMan){
IDeduction deduction = null;
try{
deduction = (IDeduction) Class.forName(strategyMan.getValue()).newInstance();
}catch (ClassNotFoundException e){
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
return deduction;
}
}
package ming.Deduction;
// 配置类
public enum StrategyMan {
SteadyDeduction("ming.Deduction.SteadyDeduction"),
FreeDeduction("ming.Deduction.FreeDeduction");
String value = "";
private StrategyMan(String _value){
this.value = _value;
}
public String getValue(){
return this.value;
}
}
package ming.entity;
// IC卡类
public class Card {
// IC卡号码
private String cardNo = "";
// 卡内金额
private int steadyMoney = 0;
// 自由交易金额
private int freeMoney = 0;
// get/set
public String getCardNo(){
return this.cardNo;
}
public void setCardNo(String cardNo){
this.cardNo = cardNo;
}
public void setSteadyMoney(int steadyMoney){
this.steadyMoney = steadyMoney;
}
public int getSteadyMoney(){
return this.steadyMoney;
}
public int getFreeMoney(){
return freeMoney;
}
public void setFreeMoney(int freeMoney){
this.freeMoney = freeMoney;
}
}
package ming.entity;
// 交易类
public class Trade {
// 编号
private byte[] tradeNo = new byte[18];
// 金额
private int amout = 0;
// get set
public byte[] getTradeNo(){
return this.tradeNo;
}
public void setTradeNo(byte[] tradeNo){
this.tradeNo = tradeNo;
}
public int getAmout(){
return this.amout;
}
public void setAmout(int amout){
this.amout = amout;
}
}
以上所述就是小编给大家介绍的《最小化交易系统 工厂方法 + 策略模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 最小化技术平台的构建(11.7)
- 014--docker编译go项目最小化
- 构建安全、可靠、最小化的 Docker 镜像
- 使用定制的JRE最小化Docker镜像
- 最小化DevOps自动化流程(Golang)
- vagrant在最小化DevOps中的作用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Markdown 在线编辑器
Markdown 在线编辑器
UNIX 时间戳转换
UNIX 时间戳转换