- 里氏替换原则
- 里氏替换代码实战
- 使用抽象类里氏替换代码实战
定义: 继承必须确保超类所拥有的性质在子类中成立. 实现了兼容性, 维护性, 扩展性. 实现某个类, 不能把父类的原有功能结构破坏掉 . 生活中的例子 : 去宜家, 都是从一个方向进, 一个方向出. 去海底捞, 服务大都一致. 一流的公司做标准.
里氏替换代码实战本例中使用储蓄卡和信用卡作为例子. 储蓄卡和信用卡都有取现和存款, 以及查询流水的功能. 但储蓄卡取现不用校验额度, 有多少取多少, 信用卡需校验额度. 储蓄卡存款是存钱, 信用卡存款是还款. 但查询流水的功能一致.
储蓄卡类
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))
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?