您当前的位置: 首页 > 

java持续实践

暂无认证

  • 4浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计模式 里氏替换原则

java持续实践 发布时间:2022-03-10 19:48:22 ,浏览量:4

文章目录
      • 里氏替换原则
      • 里氏替换代码实战
        • 使用抽象类里氏替换代码实战
学习资料来源 https://www.bilibili.com/video/BV1rU4y1f7uy

里氏替换原则

定义: 继承必须确保超类所拥有的性质在子类中成立. 实现了兼容性, 维护性, 扩展性. 实现某个类, 不能把父类的原有功能结构破坏掉 . 生活中的例子 : 去宜家, 都是从一个方向进, 一个方向出. 去海底捞, 服务大都一致. 一流的公司做标准.

里氏替换代码实战

本例中使用储蓄卡和信用卡作为例子. 储蓄卡和信用卡都有取现和存款, 以及查询流水的功能. 但储蓄卡取现不用校验额度, 有多少取多少, 信用卡需校验额度. 储蓄卡存款是存钱, 信用卡存款是还款. 但查询流水的功能一致.

储蓄卡类

public class CashCard {

    private  Logger logger = LoggerFactory.getLogger(CashCard.class);

    /**
     *  模拟提现
     * @param orderId
     * @param amount
     * @return
     */
    public String withDrawl(String orderId, BigDecimal amount) {
        logger.info("提现成功, 单号: {},  金额:{}", orderId, amount);
        return "0000";
    }

    /**
     *  存钱
     * @param orderId
     * @param amount
     * @return
     */
    public String recharge(String orderId, BigDecimal amount) {
        logger.info("储蓄成功, 单号: {}, 金额{}", orderId, amount);
        return "0000";
    }

    /**
     *  交易流水 查询
     * @return
     */
    public List tradeFlow() {
        logger.info("交易流水查询成功");
        List tradeList = new ArrayList();
        tradeList.add("10001, 100.00");
        tradeList.add("10002, 200.00");
        tradeList.add("10003, 300.00");
        return tradeList;
    }
}

信用卡类CreditCard, 继承了储蓄卡, 并对取现和还款进行了重写. 查询流水直接用父类的.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.util.List;

/**
 * 类名称:CreditCard
 * 类描述 模拟信用卡功能
 *
 * 创建时间:2022/3/10 6:47
 */
public class CreditCard extends CashCard {

    private Logger logger = LoggerFactory.getLogger(CreditCard.class);

    /**
     * 信用卡取现
     * @param orderId
     * @param amount
     * @return
     */
    @Override
    public String withDrawl(String orderId, BigDecimal amount) {
        // 检验
        if (amount.compareTo(new BigDecimal(1000)) > 0) {
            logger.info("贷款金额限额1000, 取现失败, 单号:{}, 金额:{}", orderId, amount);
            return "0001";
        }
        //模拟生成贷款单
        logger.info("生成贷款单, 单号: {}, 金额: {}", orderId, amount);
        return "0000";
    }

    @Override
    public String recharge(String orderId, BigDecimal amount) {
        // 生成还款单
        logger.info("生成还款单, 单号:{}, 金额:{}", orderId, amount);
        logger.info("还款成功, 单号:{}, 金额:{}", orderId, amount);
        return "0000";
    }

    /***
     *  生成流水 直接用父类的
     * @return
     */
    @Override
    public List tradeFlow() {
        return super.tradeFlow();
    }
}

测试类 分别调用储蓄卡和信用卡的取现和还款以及查询流水功能.

public class ApiTest {

    private Logger logger = LoggerFactory.getLogger(ApiTest.class);

    @Test
    public void test_CashCard() {
        CashCard cashCard = new CashCard();
        // 提现
        cashCard.withDrawl("100001", new BigDecimal(100));

        // 存钱
        cashCard.recharge("100002", new BigDecimal(100));
        //交易流水
        List tradeFlow = cashCard.tradeFlow();
        logger.info("储蓄卡查询交易流水:{}", JSON.toJSONString(tradeFlow));
    }

    @Test
    public void test_CreditCard() {
        CreditCard creditCard = new CreditCard();
        creditCard.withDrawl("10001", new BigDecimal(100));
        creditCard.recharge("10002", new BigDecimal(100));
        //获取 交易流水
        List tradeFlow = creditCard.tradeFlow();
        logger.info("信用卡查询交易流水:{}", JSON.toJSONString(tradeFlow));
    }
}

运行test_CashCard方法, 打印如下

07:26:25.170 [main] INFO com.thc.design.CashCard - 提现成功, 单号: 100001, 金额:100 07:26:25.172 [main] INFO com.thc.design.CashCard - 储蓄成功, 单号: 100002, 金额100 07:26:25.172 [main] INFO com.thc.design.CashCard - 交易流水查询成功 07:26:25.215 [main] INFO com.thc.design.test.ApiTest - 储蓄卡查询交易流水:[“10001, 100.00”,“10002, 200.00”,“10003, 300.00”]

运行test_CreditCard方法, 打印如下

07:26:40.714 [main] INFO com.thc.design.CreditCard - 生成贷款单, 单号: 10001, 金额: 100 07:26:40.716 [main] INFO com.thc.design.CreditCard - 生成还款单, 单号:10002, 金额:100 07:26:40.716 [main] INFO com.thc.design.CreditCard - 还款成功, 单号:10002, 金额:100 07:26:40.716 [main] INFO com.thc.design.CashCard - 交易流水查询成功 07:26:40.758 [main] INFO com.thc.design.test.ApiTest - 信用卡查询交易流水:[“10001, 100.00”,“10002, 200.00”,“10003, 300.00”]

信用卡和储蓄卡分别执行各自的提现, 生成贷款单以及储蓄和还款方法. 但查询流水方法是一致的.

使用抽象类里氏替换代码实战

定义给一个银行抽象类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 *  银行卡抽象类
 * 创建时间:2022/3/10 7:31
 */
public abstract class BankCard {

    private Logger logger = LoggerFactory.getLogger(BankCard.class);

    // 卡号
    private String cardNo;
    // 开卡时间
    private String cardDate;

    public BankCard(String cardNo, String cardDate) {
        this.cardNo = cardNo;
        this.cardDate = cardDate;
    }

    /**
     *   风控规则
     * @param amount
     * @return
     */
    abstract boolean rule(BigDecimal amount);

    // 正向存钱
    public String positive(String orderId, BigDecimal amount) {
        // 入款成功
        logger.info("卡号{} 入款成功, 单号: {}  金额:{}", cardNo, orderId, amount);
        return "0000";
    }

    // 逆向入账  减钱
    public String negative(String orderId, BigDecimal amount) {
        logger.info("卡号{} 出款成功, 单号:{}, 金额:{}", cardNo, orderId, amount);
        return "0000";
    }


    /**
     *  交易流水 查询
     * @return
     */
    public List tradeFlow() {
        logger.info("交易流水查询成功");
        List tradeList = new ArrayList();
        tradeList.add("10001, 100.00");
        tradeList.add("10002, 200.00");
        tradeList.add("10003, 300.00");
        return tradeList;
    }

    public String getCardNo() {
        return cardNo;
    }

    public String getCardDate() {
        return cardDate;
    }
}

储蓄卡类对银行抽象类进行继承

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;

/**
 * 类名称:CashCard
 * 类描述: 储蓄卡
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2022/3/10 7:39
 */
public class CashCard extends BankCard{

    private Logger logger = LoggerFactory.getLogger(CashCard.class);

    public CashCard(String cardNo, String cardDate) {
        super(cardNo, cardDate);
    }

    boolean rule(BigDecimal amount) {
        // 储蓄卡不进行风控,直接返回true
        return true;
    }

    public String withDrawl(String orderId, BigDecimal amount) {
        // 模拟支付成功
        logger.info("提现成功, 单号:{},  金额:{}", orderId, amount);
        return super.negative(orderId, amount);
    }

    /**
     *  储蓄
     */
    public String recharge(String orderId, BigDecimal amount) {
        // 模拟充值成功
        logger.info("储蓄成功, 单号:{}, 金额:{}", orderId, amount);
        return super.positive(orderId, amount);
    }
}

信用卡类对储蓄卡类进行继承

public class CreditCard extends CashCard{

    private Logger logger = LoggerFactory.getLogger(CreditCard.class);

    public CreditCard(String cardNo, String cardDate) {
        super(cardNo, cardDate);
    }

    @Override
    boolean rule(BigDecimal amount) {
        return amount.compareTo(new BigDecimal(1000))             
关注
打赏
1658054974
查看更多评论
0.1685s