最小化交易系统 工厂方法 + 策略模式

栏目: 后端 · 发布时间: 7年前

内容简介:迷你版的交易系统,最最最最简单的。。卡上有两个账户,分别是自有账户,和固定账户,简化为自由余额,固定余额,两种余额方式。扣款有两种方式

简介

迷你版的交易系统,最最最最简单的。。

扣款子模块

卡上有两个账户,分别是自有账户,和固定账户,简化为自由余额,固定余额,两种余额方式。

扣款有两种方式

扣款方式一

两个账户同时扣款一半。

固定余额 = 固定余额 - 交易金额/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;
    }
}

以上所述就是小编给大家介绍的《最小化交易系统 工厂方法 + 策略模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ruby on Rails社区网站开发

Ruby on Rails社区网站开发

布拉德伯纳 / 柳靖 / 2008-10 / 55.00元

《Ruby on Rails社区网站开发》全面探讨创建完整社区网站的开发过程。首先介绍开发一个内容简单的管理系统,之后逐渐添加新特性,以创建更完整的、使用Ruby on Rails 的Web 2.0 社区网站。还给出了开发和测试中的一些建议和提示,同时指导如何使网站更生动以及维护得更好。《Ruby on Rails社区网站开发》也探讨了如何与Flickr 、Google Maps 等其他平台集成,......一起来看看 《Ruby on Rails社区网站开发》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具