维护性、扩展性、兼容性 里氏替换原则,继承必须确保超类所拥有的性质在子类中依然成立

    一流公司做标准,二流公司做产品,三流公司做销售

    里氏替换原则 - 图1

    1. public abstract class BankCard {
    2. private Logger logger = LoggerFactory.getLogger(BankCard.class);
    3. private String cardNo; // 卡号
    4. private String cardDate; // 开卡时间
    5. public BankCard(String cardNo, String cardDate) {
    6. this.cardNo = cardNo;
    7. this.cardDate = cardDate;
    8. }
    9. abstract boolean rule(BigDecimal amount);
    10. // 正向入账,+ 钱
    11. public String positive(String orderId, BigDecimal amount) {
    12. // 入款成功,存款、还款
    13. logger.info("卡号{} 入款成功,单号:{} 金额:{}", cardNo, orderId, amount);
    14. return "0000";
    15. }
    16. // 逆向入账,- 钱
    17. public String negative(String orderId, BigDecimal amount) {
    18. // 入款成功,存款、还款
    19. logger.info("卡号{} 出款成功,单号:{} 金额:{}", cardNo, orderId, amount);
    20. return "0000";
    21. }
    22. /**
    23. * 交易流水查询
    24. *
    25. * @return 交易流水
    26. */
    27. public List<String> tradeFlow() {
    28. logger.info("交易流水查询成功");
    29. List<String> tradeList = new ArrayList<String>();
    30. tradeList.add("100001,100.00");
    31. tradeList.add("100001,80.00");
    32. tradeList.add("100001,76.50");
    33. tradeList.add("100001,126.00");
    34. return tradeList;
    35. }
    36. public String getCardNo() {
    37. return cardNo;
    38. }
    39. public String getCardDate() {
    40. return cardDate;
    41. }
    42. }
    1. public class CashCard extends BankCard {
    2. private Logger logger = LoggerFactory.getLogger(CashCard.class);
    3. public CashCard(String cardNo, String cardDate) {
    4. super(cardNo, cardDate);
    5. }
    6. boolean rule(BigDecimal amount) {
    7. return true;
    8. }
    9. /**
    10. * 提现
    11. *
    12. * @param orderId 单号
    13. * @param amount 金额
    14. * @return 状态码 0000成功、0001失败、0002重复
    15. */
    16. public String withdrawal(String orderId, BigDecimal amount) {
    17. // 模拟支付成功
    18. logger.info("提现成功,单号:{} 金额:{}", orderId, amount);
    19. return super.negative(orderId, amount);
    20. }
    21. /**
    22. * 储蓄
    23. *
    24. * @param orderId 单号
    25. * @param amount 金额
    26. */
    27. public String recharge(String orderId, BigDecimal amount) {
    28. // 模拟充值成功
    29. logger.info("储蓄成功,单号:{} 金额:{}", orderId, amount);
    30. return super.positive(orderId, amount);
    31. }
    32. /**
    33. * 风险校验
    34. *
    35. * @param cardNo 卡号
    36. * @param orderId 单号
    37. * @param amount 金额
    38. * @return 状态
    39. */
    40. public boolean checkRisk(String cardNo, String orderId, BigDecimal amount) {
    41. // 模拟风控校验
    42. logger.info("风控校验,卡号:{} 单号:{} 金额:{}", cardNo, orderId, amount);
    43. return true;
    44. }
    45. }
    1. public class CreditCard extends CashCard {
    2. private Logger logger = LoggerFactory.getLogger(CreditCard.class);
    3. public CreditCard(String cardNo, String cardDate) {
    4. super(cardNo, cardDate);
    5. }
    6. boolean rule2(BigDecimal amount) {
    7. return amount.compareTo(new BigDecimal(1000)) <= 0;
    8. }
    9. /**
    10. * 提现,信用卡贷款
    11. *
    12. * @param orderId 单号
    13. * @param amount 金额
    14. * @return 状态码
    15. */
    16. public String loan(String orderId, BigDecimal amount) {
    17. boolean rule = rule2(amount);
    18. if (!rule) {
    19. logger.info("生成贷款单失败,金额超限。单号:{} 金额:{}", orderId, amount);
    20. return "0001";
    21. }
    22. // 模拟生成贷款单
    23. logger.info("生成贷款单,单号:{} 金额:{}", orderId, amount);
    24. // 模拟支付成功
    25. logger.info("贷款成功,单号:{} 金额:{}", orderId, amount);
    26. return super.negative(orderId, amount);
    27. }
    28. /**
    29. * 还款,信用卡还款
    30. *
    31. * @param orderId 单号
    32. * @param amount 金额
    33. * @return 状态码
    34. */
    35. public String repayment(String orderId, BigDecimal amount) {
    36. // 模拟生成还款单
    37. logger.info("生成还款单,单号:{} 金额:{}", orderId, amount);
    38. // 模拟还款成功
    39. logger.info("还款成功,单号:{} 金额:{}", orderId, amount);
    40. return super.positive(orderId, amount);
    41. }
    42. }