中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

如何注冊公司網(wǎng)站免費注冊百度競價排名服務

如何注冊公司網(wǎng)站免費注冊,百度競價排名服務,網(wǎng)頁版微信app,網(wǎng)站結(jié)構(gòu)分析怎么做文章目錄 一、定義:里氏替換原則1.1 里氏替換原則1.2 里氏替換原則的作用 二、模擬場景:里氏替換原則三、違背方案:里氏替換原則3.1 工程結(jié)構(gòu)3.2 儲蓄卡和信用卡3.2.1 儲蓄卡3.2.2 信用卡 3.3 單元測試3.3.1 儲蓄卡測試3.3.2 信用卡測試 四、…

文章目錄

  • 一、定義:里氏替換原則
    • 1.1 里氏替換原則
    • 1.2 里氏替換原則的作用
  • 二、模擬場景:里氏替換原則
  • 三、違背方案:里氏替換原則
    • 3.1 工程結(jié)構(gòu)
    • 3.2 儲蓄卡和信用卡
      • 3.2.1 儲蓄卡
      • 3.2.2 信用卡
    • 3.3 單元測試
      • 3.3.1 儲蓄卡測試
      • 3.3.2 信用卡測試
  • 四、改善代碼:里氏替換原則
    • 4.1 工程結(jié)構(gòu)
    • 4.2 銀行卡:儲蓄卡和信用卡
      • 4.2.1 抽象銀行卡類
      • 4.2.2 儲蓄卡
      • 4.2.2 信用卡
    • 4.3 單元測試
      • 4.3.1 里氏替換測試
      • 4.3.2 信用卡測試
  • 五、總結(jié):里氏替換原則

一、定義:里氏替換原則

1.1 里氏替換原則

  • 里氏替換原則Liskov Substitution Principle,LSP。
    • 如果 ST 的子類型,那么所有 T 類型的對象都可以在不破壞程序的情況下被 S 類型的對象替換。
    • 簡單來說:子類可以擴展父類的功能,但不能改變父類原有的功能
    • 也就是說:當子類繼承父類時,除添加新的方法且完成新增功能外,盡量不要重寫父類的方法。
      • 子類可以實現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法。
      • 子類可以增加自己特有的方法。
      • 當子類的方法重載父類的方法時,方法的前置條件(即方法的輸入?yún)?shù))要比父類的方法更寬松。
      • 當子類的方法實現(xiàn)父類的方法(重寫、重載或?qū)崿F(xiàn)抽象方法)時,方法的后置條件(即方法的輸出或返回值)要比父類的方法更嚴格或與父類的方法相等。

1.2 里氏替換原則的作用

  • 里氏替換原則是實現(xiàn)開閉原則的重要方式之一。
  • 解決了繼承中重寫父類造成的可復用性變差的問題。
  • 是動作正確性的保證,即類的擴展不會給已有的系統(tǒng)引入新的錯誤,降低了代碼出錯的可能性。
  • 加強程序的健壯性,同時變更時可以做到非常好的兼容性,提高程序的維護性、可擴展性,降低需求變更時引入的風險。

二、模擬場景:里氏替換原則

  • 我們會使用各種類型的銀行卡,例如儲蓄卡、信用卡,還有一些其他特性的銀行卡。
    • 儲蓄卡和信用卡都具備一定的消費功能,但又有一些不同。例如信用卡不宜提現(xiàn),如果提現(xiàn)可能會產(chǎn)生高額的利息。
  • 模擬場景:假設在構(gòu)建銀行系統(tǒng)時,儲蓄卡是第一個類,信用卡是第二個類。
  • 為了讓信用卡可以使用儲蓄卡的一些方法,選擇由信用卡類繼承儲蓄卡類,討論是否滿足里氏替換原則產(chǎn)生的一些要點。

三、違背方案:里氏替換原則

  • 儲蓄卡和信用卡在使用功能上類似,都有支付、提現(xiàn)、還款、充值等功能,但有些許不同。
    • 例如支付:儲蓄卡做的是賬戶扣款動作,信用卡做的是生成貸款單動作。

3.1 工程結(jié)構(gòu)

design-1.3-0
|——src|——main|--java|--com.lino.design|--CashCard.java|--CreditCard.java|——test|--java|--com.lino.design.test|--ApiTest.java

3.2 儲蓄卡和信用卡

3.2.1 儲蓄卡

CashCard.java

package com.lino.design;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @description: 模擬儲蓄卡功能*/
public class CashCard {private Logger logger = LoggerFactory.getLogger(CashCard.class);/*** 提現(xiàn)** @param orderId 單號* @param amount  金額* @return 狀態(tài)碼 0000成功、0001失敗、0002重復*/public String withdrawal(String orderId, BigDecimal amount) {// 模擬支付成功logger.info("提現(xiàn)成功,單號:{} 金額:{}", orderId, amount);return "0000";}/*** 儲值** @param orderId 單號* @param amount  金額* @return 狀態(tài)碼 0000成功、0001失敗、0002重復*/public String recharge(String orderId, BigDecimal amount) {// 模擬充值成功logger.info("儲值成功,單號:{} 金額:{}", orderId, amount);return "0000";}/*** 交易流水查詢** @return 交易流水*/public List<String> tradeFlow() {logger.info("交易流水查詢成功");List<String> tradeList = new ArrayList<>();tradeList.add("100001,100.00");tradeList.add("100001,80.00");tradeList.add("100001,76.50");tradeList.add("100001,126.00");return tradeList;}
}
  • 在儲蓄卡的功能實現(xiàn)中包括了三個方法:提現(xiàn)、儲蓄、交易流水查詢,這些是模擬儲蓄卡的基本功能。

3.2.2 信用卡

CreditCard.java

package com.lino.design;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.util.List;/*** @description: 模擬信用卡功能*/
public class CreditCard extends CashCard {private Logger logger = LoggerFactory.getLogger(CreditCard.class);@Overridepublic String withdrawal(String orderId, BigDecimal amount) {// 校驗if (amount.compareTo(new BigDecimal(1000)) >= 0) {logger.info("貸款金額校驗(限額1000元),單號:{} 金額:{}", orderId, amount);return "0001";}// 模擬生成貸款單logger.info("生成貸款單,單號:{} 金額:{}", orderId, amount);// 模擬支付成功logger.info("貸款成功,單號:{} 金額:{}", orderId, amount);return "0000";}@Overridepublic String recharge(String orderId, BigDecimal amount) {// 模擬生成還款單logger.info("生成還款單,單號:{} 金額:{}", orderId, amount);// 模擬還款成功logger.info("還款成功,單號:{} 金額:{}", orderId, amount);return "0000";}@Overridepublic List<String> tradeFlow() {return super.tradeFlow();}}
  • 信用卡的功能實現(xiàn)是在繼承了儲蓄卡類后,進行方法重學:支付 withdrawal()、還款 recharge()。交易流水可以復用,不用重寫這個類。
  • 這種繼承父類方式的優(yōu)點是復用了父類的核心功能邏輯,但是也破壞了原有的方法。
    • 此時繼承父類實現(xiàn)的信用卡類并不滿足里氏替換原則,也就是說,此時的子類不能承擔原父類的功能,直接給儲蓄卡使用。

3.3 單元測試

3.3.1 儲蓄卡測試

ApiTest.java

@Test
public void test_CashCard() {CashCard cashCard = new CashCard();// 提現(xiàn)cashCard.withdrawal("100001", new BigDecimal(100));// 儲蓄cashCard.recharge("100001", new BigDecimal(100));// 交易流水List<String> tradeFlow = cashCard.tradeFlow();logger.info("查詢交易流水:{}", JSON.toJSONString(tradeFlow));
}

測試結(jié)果

10:58:28.027 [main] INFO  com.lino.design.CashCard - 提現(xiàn)成功,單號:100001 金額:100
10:58:28.031 [main] INFO  com.lino.design.CashCard - 儲值成功,單號:100001 金額:100
10:58:28.031 [main] INFO  com.lino.design.CashCard - 交易流水查詢成功
10:58:28.169 [main] INFO  com.lino.design.test.ApiTest - 查詢交易流水:["100001,100.00","100001,80.00","100001,76.50","100001,126.00"]

3.3.2 信用卡測試

ApiTest.java

@Test
public void test_CreditCard() {CreditCard creditCard = new CreditCard();// 支付creditCard.withdrawal("100001", new BigDecimal(100));// 還款creditCard.recharge("100001", new BigDecimal(100));// 交易流水List<String> tradeFlow = creditCard.tradeFlow();logger.info("查詢交易流水:{}", JSON.toJSONString(tradeFlow));
}

測試結(jié)果

10:59:23.970 [main] INFO  com.lino.design.CreditCard - 生成貸款單,單號:100001 金額:100
10:59:23.970 [main] INFO  com.lino.design.CreditCard - 貸款成功,單號:100001 金額:100
10:59:23.970 [main] INFO  com.lino.design.CreditCard - 生成還款單,單號:100001 金額:100
10:59:23.970 [main] INFO  com.lino.design.CreditCard - 還款成功,單號:100001 金額:100
10:59:23.970 [main] INFO  com.lino.design.CashCard - 交易流水查詢成功
10:59:24.003 [main] INFO  com.lino.design.test.ApiTest - 查詢交易流水:["100001,100.00","100001,80.00","100001,76.50","100001,126.00"]

四、改善代碼:里氏替換原則

4.1 工程結(jié)構(gòu)

design-1.3-1
|——src|——main|--java|--com.lino.design|--BandCard.java|--CashCard.java|--CreditCard.java|——test|--java|--com.lino.design.test|--ApiTest.java

4.2 銀行卡:儲蓄卡和信用卡

  • 儲蓄卡和信用卡在功能使用上有些許類似,在實際的開發(fā)過程中也有很多共同可復用的屬性及邏輯。
  • 實現(xiàn)這樣的類的最好方式是提取出一個抽象類,由抽象類定義所有卡的共用核心屬性、邏輯,把卡的支付和還款等動作抽象成正向和逆向操作。

4.2.1 抽象銀行卡類

BandCard.java

package com.lino.design;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @description: 銀行卡*/
public abstract class BandCard {private Logger logger = LoggerFactory.getLogger(BandCard.class);/*** 卡號*/private String cardNo;/*** 開卡時間*/private String cardDate;public BandCard(String cardNo, String cardDate) {this.cardNo = cardNo;this.cardDate = cardDate;}/*** 金額判斷規(guī)則** @param amount 金額* @return 是否符合規(guī)則*/abstract boolean rule(BigDecimal amount);/*** 正向入賬:+錢** @param orderId 單號* @param amount  金額* @return 狀態(tài)碼*/public String positive(String orderId, BigDecimal amount) {// 入款成功,存款、還款logger.info("卡號{} 入款成功:單號:{} 金額:{}", cardNo, orderId, amount);return "0000";}/*** 逆向入賬:-錢** @param orderId 單號* @param amount  金額* @return 狀態(tài)碼*/public String negative(String orderId, BigDecimal amount) {// 出款成功,支付、貸款logger.info("卡號{} 出款成功:單號:{} 金額:{}", cardNo, orderId, amount);return "0000";}/*** 交易流水查詢** @return 交易流水*/public List<String> tradeFlow() {logger.info("交易流水查詢成功");List<String> tradeList = new ArrayList<>();tradeList.add("100001,100.00");tradeList.add("100001,80.00");tradeList.add("100001,76.50");tradeList.add("100001,126.00");return tradeList;}public String getCardNo() {return cardNo;}public String getCardDate() {return cardDate;}
}
  • 在抽象銀行卡類中,提供了基本的卡屬性,包括卡號、開卡時間及三個核心方法。
    • 正向入賬,加錢;逆向入賬,減錢;交易流水查詢;

4.2.2 儲蓄卡

CashCard.java

package com.lino.design;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;/*** @description: 模擬儲值卡功能*/
public class CashCard extends BandCard {private Logger logger = LoggerFactory.getLogger(CashCard.class);public CashCard(String cardNo, String cardDate) {super(cardNo, cardDate);}@Overrideboolean rule(BigDecimal amount) {return true;}/*** 提現(xiàn)** @param orderId 單號* @param amount  金額* @return 狀態(tài)碼 0000成功、0001失敗、0002重復*/public String withdrawal(String orderId, BigDecimal amount) {// 模擬支付成功logger.info("提現(xiàn)成功,單號:{} 金額:{}", orderId, amount);return super.negative(orderId, amount);}/*** 儲值** @param orderId 單號* @param amount  金額* @return 狀態(tài)碼 0000成功、0001失敗、0002重復*/public String recharge(String orderId, BigDecimal amount) {// 模擬充值成功logger.info("儲值成功,單號:{} 金額:{}", orderId, amount);return super.positive(orderId, amount);}/*** 風險校驗** @param cardNo  卡號* @param orderId 單號* @param amount  金額* @return 狀態(tài)碼*/public boolean checkRisk(String cardNo, String orderId, BigDecimal amount) {// 模擬風控校驗logger.info("風控校驗:卡號:{} 單號:{} 金額:{}", cardNo, orderId, amount);return true;}
}
  • 儲蓄卡類中繼承抽象銀行卡父類 BandCard,實現(xiàn)的核心功能包括規(guī)則過濾 rule、提現(xiàn) withdrawal、儲蓄 recharge 和新增的擴展方法,即風控校驗 checkRisk。
  • 這樣的實現(xiàn)方式滿足了里氏替換的基本原則,即實現(xiàn)抽象類的抽象方法,又沒有破壞父類中的原有方法。

4.2.2 信用卡

CreditCard.java

package com.lino.design;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;/*** @description: 信用卡*/
public class CreditCard extends CashCard {private Logger logger = LoggerFactory.getLogger(CreditCard.class);public CreditCard(String cardNo, String cardDate) {super(cardNo, cardDate);}boolean rule2(BigDecimal amount) {return amount.compareTo(new BigDecimal(1000)) <= 0;}/*** 提現(xiàn),信用卡貸款** @param orderId 單號* @param amount  金額* @return 狀態(tài)碼*/public String loan(String orderId, BigDecimal amount) {boolean rule = rule2(amount);// 校驗if (!rule) {logger.info("生成貸款單失敗,金額超限。單號:{} 金額:{}", orderId, amount);return "0001";}// 模擬生成貸款單logger.info("生成貸款單,單號:{} 金額:{}", orderId, amount);// 模擬支付成功logger.info("貸款成功,單號:{} 金額:{}", orderId, amount);return super.negative(orderId, amount);}/*** 還款,信用卡還款** @param orderId 單號* @param amount  金額* @return 狀態(tài)碼*/public String repayment(String orderId, BigDecimal amount) {// 模擬生成還款單logger.info("生成還款單,單號:{} 金額:{}", orderId, amount);// 模擬還款成功logger.info("還款成功,單號:{} 金額:{}", orderId, amount);return super.positive(orderId, amount);}
}
  • 信用卡類在繼承父類后,使用了公用的屬性,即卡號 cardNo、開卡時間 cardDate,同時新增了符合信用卡功能的新方法,即貸款 loan、還款 repayment,并在兩個方法中都使用了抽象類的核心功能。
  • 另外,關于儲蓄卡中的規(guī)則校驗方法,新增了自己的規(guī)則方法 rule2,并沒有破壞儲蓄卡中的校驗方法。
  • 以上的實現(xiàn)方式都是在遵循里氏替換原則下完成的,子類隨時可以替換儲蓄卡類。

4.3 單元測試

4.3.1 里氏替換測試

ApiTest.java

@Test
public void test_bandCard() {logger.info("里氏替換前,CashCard類:");CashCard bandCard = new CashCard("6214567800989876", "2022-12-14");// 提現(xiàn)bandCard.withdrawal("100001", new BigDecimal(100));// 儲蓄bandCard.recharge("100001", new BigDecimal(100));logger.info("里氏替換后,CreditCard類:");CashCard creditCard = new CreditCard("6214567800989876", "2022-12-14");// 提現(xiàn)creditCard.withdrawal("100001", new BigDecimal(1000000));// 儲蓄creditCard.recharge("100001", new BigDecimal(100));
}

測試結(jié)果

11:16:03.817 [main] INFO  com.lino.design.test.ApiTest - 里氏替換前,CashCard類:
11:16:03.817 [main] INFO  com.lino.design.CashCard - 提現(xiàn)成功,單號:100001 金額:100
11:16:03.817 [main] INFO  com.lino.design.BandCard - 卡號6214567800989876 出款成功:單號:100001 金額:100
11:16:03.817 [main] INFO  com.lino.design.CashCard - 儲值成功,單號:100001 金額:100
11:16:03.817 [main] INFO  com.lino.design.BandCard - 卡號6214567800989876 入款成功:單號:100001 金額:100
11:16:03.817 [main] INFO  com.lino.design.test.ApiTest - 里氏替換后,CreditCard類:
11:16:03.817 [main] INFO  com.lino.design.CashCard - 提現(xiàn)成功,單號:100001 金額:1000000
11:16:03.817 [main] INFO  com.lino.design.BandCard - 卡號6214567800989876 出款成功:單號:100001 金額:1000000
11:16:03.817 [main] INFO  com.lino.design.CashCard - 儲值成功,單號:100001 金額:100
11:16:03.817 [main] INFO  com.lino.design.BandCard - 卡號6214567800989876 入款成功:單號:100001 金額:100

4.3.2 信用卡測試

ApiTest.java

@Test
public void test_CreditCard() {CreditCard creditCard = new CreditCard("6214567800989876", "2022-12-14");// 支付,貸款creditCard.loan("100001", new BigDecimal(100));// 還款creditCard.repayment("100001", new BigDecimal(100));
}

測試結(jié)果

11:13:03.042 [main] INFO  com.lino.design.CreditCard - 生成貸款單,單號:100001 金額:100
11:13:03.042 [main] INFO  com.lino.design.CreditCard - 貸款成功,單號:100001 金額:100
11:13:03.042 [main] INFO  com.lino.design.BandCard - 卡號6214567800989876 出款成功:單號:100001 金額:100
11:13:03.042 [main] INFO  com.lino.design.CreditCard - 生成還款單,單號:100001 金額:100
11:13:03.042 [main] INFO  com.lino.design.CreditCard - 還款成功,單號:100001 金額:100
11:13:03.042 [main] INFO  com.lino.design.BandCard - 卡號6214567800989876 入款成功:單號:100001 金額:100
  • 通過以上的測試結(jié)果可以看到,儲蓄卡功能正常,繼承儲蓄卡實現(xiàn)的信用卡功能也正常。
  • 同時,原有儲蓄卡類的功能可以由信用卡類支持,即 CashCard creditCard = new CreditCard()。

五、總結(jié):里氏替換原則

  • 繼承作為面向?qū)ο蟮闹匾卣?#xff0c;雖然給程序開發(fā)帶來了非常大的便利,但也引入了一些弊端。
    • 繼承的開發(fā)方式會給代碼帶來侵入性,可移植能力降低,類之間的耦合度較高。
    • 當對父類修改時,就要考慮一整套子類的實現(xiàn)是否由風險,測試成本較高。
  • 里氏替換原則的目的是使用約定的方式,讓使用繼承后的代碼具備良好的擴展性和兼容性。
    • 在日常開發(fā)中使用繼承的地方并不多,在代碼規(guī)范中也不會允許多層繼承,尤其是一些核心服務的擴展。
    • 而繼承多數(shù)用在系統(tǒng)架構(gòu)初期定義好的邏輯上或抽象出的核心功能里。
    • 如果使用了繼承,就一定要遵從里氏替換原則,否則會讓代碼出現(xiàn)問題的概率變得更大。
http://m.risenshineclean.com/news/60772.html

相關文章:

  • wordpress+更新+慢贛州seo
  • 什么軟件可以做app軟件seo是什么職業(yè)做什么的
  • 福田慶三baby案例照批量優(yōu)化網(wǎng)站軟件
  • 網(wǎng)站建設培訓招生長尾詞挖掘
  • 安平誰做網(wǎng)站好百度快速收錄軟件
  • 專業(yè)APP客戶端做網(wǎng)站抖音推廣
  • 設計師網(wǎng)站prinestsem推廣競價托管公司
  • 網(wǎng)站建設與管理初級教學搜索引擎優(yōu)化排名品牌
  • 西寧網(wǎng)站seo價格電商平臺哪個最好最可靠
  • 深圳網(wǎng)站公司好軟件培訓機構(gòu)排行榜
  • dw做的網(wǎng)站與瀏覽器不匹配西安seo報價
  • 做中醫(yī)藥網(wǎng)站有前景嗎視頻網(wǎng)站建設
  • iis7 網(wǎng)站用戶權限長沙網(wǎng)絡推廣公司
  • phpstorm做網(wǎng)站搜索引擎優(yōu)化seo名詞解釋
  • 哪家外貿(mào)網(wǎng)站做的好寧波網(wǎng)站推廣方案
  • wordpress輸入密碼訪問湖南有實力seo優(yōu)化
  • hostinger wordpress惠州seo關鍵詞排名
  • dnf免做卡網(wǎng)站優(yōu)化工具箱下載
  • 做企業(yè)網(wǎng)站建設下載百度app
  • 萬虹點讀機如何做系統(tǒng)下載網(wǎng)站公司seo推廣營銷網(wǎng)站
  • 全屋定制加盟品牌加盟網(wǎng)杭州做seo的公司
  • magento 網(wǎng)站seo優(yōu)化與推廣招聘
  • 聊城做網(wǎng)站的公司咨詢最常用的幾個關鍵詞
  • 網(wǎng)站建設主管招聘浙江百度查關鍵詞排名
  • seo優(yōu)化銷售seo網(wǎng)上培訓課程
  • 邯鄲專業(yè)做網(wǎng)站報價建設網(wǎng)站公司
  • 1核2g 做網(wǎng)站百度手機應用商店
  • 做網(wǎng)站的小圖標360網(wǎng)站排名優(yōu)化
  • 昆明哪些做網(wǎng)站建設的公司網(wǎng)站惡意點擊軟件
  • 做水果網(wǎng)站行營銷推廣的形式包括