国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java設(shè)計(jì)模式 規(guī)范與重構(gòu)】 二 重構(gòu)的保障:?jiǎn)卧獪y(cè)試,以及如何提高代碼可測(cè)試性

這篇具有很好參考價(jià)值的文章主要介紹了【Java設(shè)計(jì)模式 規(guī)范與重構(gòu)】 二 重構(gòu)的保障:?jiǎn)卧獪y(cè)試,以及如何提高代碼可測(cè)試性。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

其實(shí)之前的工作中強(qiáng)調(diào)過(guò)很多次自己做測(cè)試的重要性,例如講單元測(cè)試的:【C#編程最佳實(shí)踐 一】單元測(cè)試實(shí)踐,講單元測(cè)試規(guī)范的【阿里巴巴Java編程規(guī)范學(xué)習(xí) 四】Java質(zhì)量安全規(guī)約,講接口測(cè)試的:【C#編程最佳實(shí)踐 十三】接口測(cè)試實(shí)踐,這里舊事重提就不再詳細(xì)展開(kāi)了,回顧下單元測(cè)試的基本概念,重點(diǎn)來(lái)看如何提升代碼的可測(cè)試性。

單元測(cè)試

依次從WHAT,WHY,HOW,HOW去了解。

什么是單元測(cè)試

單元測(cè)試由RD自己來(lái)編寫,用來(lái)測(cè)試自己寫的代碼的正確性。它與集成測(cè)試的區(qū)別是測(cè)試粒度

  • 集成測(cè)試的測(cè)試對(duì)象是整個(gè)系統(tǒng)或者某個(gè)功能模塊,比如測(cè)試用戶注冊(cè)、登錄功能是否正常,是一種端到端(end to end)的測(cè)試。
  • 單元測(cè)試的測(cè)試對(duì)象是類或者函數(shù),用來(lái)測(cè)試一個(gè)類和函數(shù)是否都按照預(yù)期的邏輯執(zhí)行。這是代碼層級(jí)的測(cè)試

單元測(cè)試相對(duì)于集成測(cè)試(Integration Testing)來(lái)說(shuō),測(cè)試的粒度更小一些。

寫單元測(cè)試的好處

單元測(cè)試除了能有效地為重構(gòu)保駕護(hù)航之外,也是保證代碼質(zhì)量最有效的兩個(gè)手段之一(另一個(gè)是 Code Review),寫單元測(cè)試有如下好處:

  • 寫單元測(cè)試能有效地發(fā)現(xiàn)代碼中的 bug,通過(guò)寫單元測(cè)試可以節(jié)省很多 fix 低級(jí) bug 的時(shí)間,能夠有時(shí)間去做其他更有意義的事情。
  • 寫單元測(cè)試能發(fā)現(xiàn)代碼設(shè)計(jì)上的問(wèn)題,代碼的可測(cè)試性是評(píng)判代碼質(zhì)量的一個(gè)重要標(biāo)準(zhǔn)。對(duì)于一段代碼,如果很難為其編寫單元測(cè)試,或者單元測(cè)試寫起來(lái)很吃力,需要依靠單元測(cè)試框架里很高級(jí)的特性才能完成,那往往就意味著代碼設(shè)計(jì)得不夠合理,比如,沒(méi)有使用依賴注入、大量使用靜態(tài)函數(shù)、全局變量、代碼高度耦合等
  • 單元測(cè)試是對(duì)集成測(cè)試的有力補(bǔ)充,程序運(yùn)行的 bug 往往出現(xiàn)在一些邊界條件、異常情況下,比如,除數(shù)未判空、網(wǎng)絡(luò)超時(shí)。而大部分異常情況都比較難在測(cè)試環(huán)境中模擬
  • 寫單元測(cè)試的過(guò)程本身就是代碼重構(gòu)的過(guò)程,持續(xù)重構(gòu)應(yīng)該作為開(kāi)發(fā)的一部分來(lái)執(zhí)行,寫單元測(cè)試實(shí)際上就是落地執(zhí)行持續(xù)重構(gòu)的一個(gè)有效途徑。設(shè)計(jì)和實(shí)現(xiàn)代碼的時(shí)候,我們很難把所有的問(wèn)題都想清楚編寫單元測(cè)試就相當(dāng)于對(duì)代碼的一次自我 Code Review,在這個(gè)過(guò)程中,可以發(fā)現(xiàn)一些設(shè)計(jì)上的問(wèn)題(比如代碼設(shè)計(jì)的不可測(cè)試)以及代碼編寫方面的問(wèn)題(比如一些邊界條件處理不當(dāng))等,然后針對(duì)性的進(jìn)行重構(gòu)
  • 閱讀單元測(cè)試能幫助我們快速熟悉代碼,文檔結(jié)合單元測(cè)試,我們不需要深入的閱讀代碼,便能知道代碼實(shí)現(xiàn)了什么功能,有哪些特殊情況需要考慮,有哪些邊界條件需要處理。不需要深入的閱讀代碼,便能知道代碼實(shí)現(xiàn)了什么功能,有哪些特殊情況需要考慮,有哪些邊界條件需要處理。
  • 單元測(cè)試是 TDD 可落地執(zhí)行的改進(jìn)方案,測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(Test-Driven Development,簡(jiǎn)稱 TDD)是一個(gè)經(jīng)常被提及但很少被執(zhí)行的開(kāi)發(fā)模式。它的核心指導(dǎo)思想就是測(cè)試用例先于代碼編寫,但很難落地,不如先寫代碼,緊接著寫單元測(cè)試,最后根據(jù)單元測(cè)試反饋出來(lái)問(wèn)題,再回過(guò)頭去重構(gòu)代碼,變相落實(shí)TDD,測(cè)試驅(qū)動(dòng)重構(gòu)與FIX

其實(shí)單元測(cè)試就是對(duì)代碼設(shè)計(jì)和功能邏輯的一次反思,粗粒度的CR,結(jié)合CR,推動(dòng)和保障持續(xù)重構(gòu)。

如何編寫單元測(cè)試

物理上可以借助Java 中比較出名的單元測(cè)試框架有 Junit、TestNG、Spring Test 等。這些框架提供了通用的執(zhí)行流程(比如執(zhí)行測(cè)試用例的 TestCaseRunner)和工具類庫(kù)(比如各種 Assert 判斷函數(shù)),而主觀經(jīng)驗(yàn)上要有這樣的意識(shí)

  • 編寫單元測(cè)試盡管繁瑣,但并不是太耗時(shí),不同測(cè)試用例之間的代碼差別可能并不是很大,簡(jiǎn)單 copy-paste 改改就行
  • 可以稍微放低對(duì)單元測(cè)試代碼質(zhì)量的要求,命名稍微有些不規(guī)范,代碼稍微有些重復(fù),也都是沒(méi)有問(wèn)題的,但代碼規(guī)范意識(shí)要時(shí)刻有,要達(dá)到想降低要求都降不了的水平
  • 覆蓋率作為衡量單元測(cè)試質(zhì)量的重要但不是唯一標(biāo)準(zhǔn),更重要的是要看測(cè)試用例是否覆蓋了所有可能的情況
  • 單元測(cè)試不要依賴被測(cè)試函數(shù)的具體實(shí)現(xiàn)邏輯,它只關(guān)心被測(cè)函數(shù)實(shí)現(xiàn)了什么功能。切不可為了追求覆蓋率,逐行閱讀代碼
  • 通過(guò)單元測(cè)試框架無(wú)法測(cè)試,多半是因?yàn)榇a的可測(cè)試性不好,需要思考下代碼的設(shè)計(jì)

單元測(cè)試就是一個(gè)透明測(cè)試,我們只關(guān)注功能而無(wú)需關(guān)注實(shí)現(xiàn)細(xì)節(jié),關(guān)注的功能要關(guān)注是否覆蓋了所有可能場(chǎng)景

單元測(cè)試為何難落地執(zhí)行

一方面,寫單元測(cè)試本身比較繁瑣,技術(shù)挑戰(zhàn)不大,很多程序員不愿意去寫;另一方面,研發(fā)比較偏向“快、糙、猛”,容易因?yàn)殚_(kāi)發(fā)進(jìn)度緊,導(dǎo)致單元測(cè)試的執(zhí)行虎頭蛇尾。最后,關(guān)鍵問(wèn)題還是團(tuán)隊(duì)沒(méi)有建立對(duì)單元測(cè)試正確的認(rèn)識(shí),覺(jué)得可有可無(wú),單靠督促很難執(zhí)行得很好

代碼可測(cè)試性

簡(jiǎn)而言之,代碼的可測(cè)試性,就是針對(duì)代碼編寫單元測(cè)試的難易程度。對(duì)于一段代碼,如果很難為其編寫單元測(cè)試,或者單元測(cè)試寫起來(lái)很費(fèi)勁,需要依靠單元測(cè)試框架中很高級(jí)的特性,那往往就意味著代碼設(shè)計(jì)得不夠合理,代碼的可測(cè)試性不好.

提高代碼可測(cè)試性:依賴注入和二次封裝

如何讓代碼可測(cè)試性更好呢?最常用的方式就是依賴注入了,通過(guò)DI實(shí)現(xiàn)反轉(zhuǎn),將對(duì)象的創(chuàng)建交給業(yè)務(wù)調(diào)用方,這樣就可以隨意控制輸出的結(jié)果,從而達(dá)到mock數(shù)據(jù)的目的,最好搭配多態(tài),讓mock類之間基于父類注入,例如將Mock數(shù)據(jù)注入到類中進(jìn)行測(cè)試。例如


public class MockWalletRpcServiceOne extends WalletRpcService {
  public String moveMoney(Long id, Long fromUserId, Long toUserId, Double amount) {
    return "123bac";
  } 
}

public class MockWalletRpcServiceTwo extends WalletRpcService {
  public String moveMoney(Long id, Long fromUserId, Long toUserId, Double amount) {
    return null;
  } 
}

通過(guò)依賴注入注入到主類


public class Transaction {
  //...
  // 添加一個(gè)成員變量及其set方法
  private WalletRpcService walletRpcService;
  
  public void setWalletRpcService(WalletRpcService walletRpcService) {
    this.walletRpcService = walletRpcService;
  }
  // ...
  public boolean execute() {
    // ...
    // 刪除下面這一行代碼
    // WalletRpcService walletRpcService = new WalletRpcService();
    // ...
  }
}

使用時(shí)直接注入Mock類


public void testExecute() {
  Long buyerId = 123L;
  Long sellerId = 234L;
  Long productId = 345L;
  Long orderId = 456L;
  Transction transaction = new Transaction(null, buyerId, sellerId, productId, orderId);
  // 使用mock對(duì)象來(lái)替代真正的RPC服務(wù)
  transaction.setWalletRpcService(new MockWalletRpcServiceOne()):
  boolean executedResult = transaction.execute();
  assertTrue(executedResult);
  assertEquals(STATUS.EXECUTED, transaction.getStatus());
}

對(duì)于一些需要外部依賴的遠(yuǎn)程服務(wù),因?yàn)槲覀儾荒苄薷倪h(yuǎn)程服務(wù)代碼,所以需要組合mock、二次封裝、依賴注入等方式解決,也就是類不直接依賴于遠(yuǎn)程類,而是依賴于封裝在遠(yuǎn)程類之上的本地方法,測(cè)試的時(shí)候mock封裝類即可。例如在遠(yuǎn)程調(diào)用的RedisDistributedLock之上封裝一層而不是直接調(diào)用


public class TransactionLock {
  public boolean lock(String id) {
    return RedisDistributedLock.getSingletonIntance().lockTransction(id);
  }
  
  public void unlock() {
    RedisDistributedLock.getSingletonIntance().unlockTransction(id);
  }
}

主類與依賴的封裝類通過(guò)依賴注入來(lái)組織

public class Transaction {
  //...
  private TransactionLock lock;
  
  public void setTransactionLock(TransactionLock lock) {
    this.lock = lock;
  }
 
  public boolean execute() {
    //...
    try {
      isLocked = lock.lock();
      //...
    } finally {
      if (isLocked) {
        lock.unlock();
      }
    }
    //...
  }
}

我們?cè)跍y(cè)試時(shí)就可以直接將Mock的封裝類注入主類測(cè)試

// 二次封裝遠(yuǎn)程調(diào)用類,然后將mock的封裝類DI注入到主類中進(jìn)行測(cè)試
public void testExecute() {
  Long buyerId = 123L;
  Long sellerId = 234L;
  Long productId = 345L;
  Long orderId = 456L;
  
  TransactionLock mockLock = new TransactionLock() {
    public boolean lock(String id) {
      return true;
    }
  
    public void unlock() {}
  };
  
  Transction transaction = new Transaction(null, buyerId, sellerId, productId, orderId);
  transaction.setWalletRpcService(new MockWalletRpcServiceOne());
  transaction.setTransactionLock(mockLock);
  boolean executedResult = transaction.execute();
  assertTrue(executedResult);
  assertEquals(STATUS.EXECUTED, transaction.getStatus());
}

哪些代碼可測(cè)試性不好

下面整理一些影響代碼可測(cè)試性的問(wèn)題

1 未決行為

所謂的未決行為邏輯就是,代碼的輸出是隨機(jī)或者說(shuō)不確定的,比如,跟時(shí)間、隨機(jī)數(shù)有關(guān)的代碼,例如:


public class Demo {
  public long caculateDelayDays(Date dueTime) {
    long currentTimestamp = System.currentTimeMillis();
    if (dueTime.getTime() >= currentTimestamp) {
      return 0;
    }
    long delayTime = currentTimestamp - dueTime.getTime();
    long delayDays = delayTime / 86400;
    return delayDays;
  }
}

這是一段計(jì)算延期時(shí)間的代碼,當(dāng)前時(shí)間一直在變,而這種變化不是通過(guò)參數(shù)傳遞進(jìn)來(lái)的,所以隨著時(shí)間的推移,單元測(cè)試的輸出結(jié)果會(huì)有不同,所以為了提高代碼可測(cè)試性,可以把currentTimestamp 這個(gè)參數(shù)當(dāng)成局部變量傳進(jìn)來(lái):


public class Demo {
  public long caculateDelayDays(Date dueTime, Date currentTime) {
    if (dueTime.getTime() >= currentTime..getTime()) {
      return 0;
    }
    long delayTime = currentTime..getTime() - dueTime.getTime();
    long delayDays = delayTime / 86400;
    return delayDays;
  }
}

2 全局變量

全局變量是一種面向過(guò)程的編程風(fēng)格,有種種弊端。濫用全局變量也讓編寫單元測(cè)試變得困難,同一個(gè)全局變量被多個(gè)單元測(cè)試用例訪問(wèn)并設(shè)置值,會(huì)讓單元測(cè)試結(jié)果不準(zhǔn)確,例如


public class RangeLimiter {
  private static AtomicInteger position = new AtomicInteger(0);
  public static final int MAX_LIMIT = 5;
  public static final int MIN_LIMIT = -5;

  public boolean move(int delta) {
    int currentPos = position.addAndGet(delta);
    boolean betweenRange = (currentPos <= MAX_LIMIT) && (currentPos >= MIN_LIMIT);
    return betweenRange;
  }
}

public class RangeLimiterTest {
  public void testMove_betweenRange() {
    RangeLimiter rangeLimiter = new RangeLimiter();
    assertTrue(rangeLimiter.move(1));
    assertTrue(rangeLimiter.move(3));
    assertTrue(rangeLimiter.move(-5));
  }

  public void testMove_exceedRange() {
    RangeLimiter rangeLimiter = new RangeLimiter();
    assertFalse(rangeLimiter.move(6));
  }
}

position 是一個(gè)靜態(tài)全局變量,第一個(gè)測(cè)試用例執(zhí)行完成之后,position 的值變成了 -1;再執(zhí)行第二個(gè)測(cè)試用例的時(shí)候,position 變成了 5,move() 函數(shù)返回 true,assertFalse 語(yǔ)句判定失敗。所以,第二個(gè)測(cè)試用例運(yùn)行失敗

3 靜態(tài)方法

靜態(tài)方法跟全局變量一樣,也是一種面向過(guò)程的編程思維。在代碼中調(diào)用靜態(tài)方法,有時(shí)候會(huì)導(dǎo)致代碼不易測(cè)試。主要原因是靜態(tài)方法也很難 mock,因?yàn)殪o態(tài)方法沒(méi)有多態(tài)的特性,沒(méi)辦法使用mock方法。

4 復(fù)雜繼承

相比組合關(guān)系,繼承關(guān)系的代碼結(jié)構(gòu)更加耦合、不靈活,更加不易擴(kuò)展、不易維護(hù)。實(shí)際上,繼承關(guān)系也更加難測(cè)試。這也印證了代碼的可測(cè)試性跟代碼質(zhì)量的相關(guān)性。

如果父類需要 mock 某個(gè)依賴對(duì)象才能進(jìn)行單元測(cè)試,那所有的子類、子類的子類……在編寫單元測(cè)試的時(shí)候,都要 mock 這個(gè)依賴對(duì)象。對(duì)于層次很深(在繼承關(guān)系類圖中表現(xiàn)為縱向深度)、結(jié)構(gòu)復(fù)雜(在繼承關(guān)系類圖中表現(xiàn)為橫向廣度)的繼承關(guān)系,越底層的子類要 mock 的對(duì)象可能就會(huì)越多,這樣就會(huì)導(dǎo)致,底層子類在寫單元測(cè)試的時(shí)候,要一個(gè)一個(gè) mock 很多依賴對(duì)象,而且還需要查看父類代碼,去了解該如何 mock 這些依賴對(duì)象。

利用組合而非繼承來(lái)組織類之間的關(guān)系,類之間的結(jié)構(gòu)層次比較扁平,在編寫單元測(cè)試的時(shí)候,只需要 mock 類所組合依賴的對(duì)象即可

5 高耦合代碼

如果一個(gè)類職責(zé)很重,需要依賴十幾個(gè)外部對(duì)象才能完成工作,代碼高度耦合,那在編寫單元測(cè)試的時(shí)候,可能需要 mock 這十幾個(gè)依賴的對(duì)象。不管是從代碼設(shè)計(jì)的角度來(lái)說(shuō),還是從編寫單元測(cè)試的角度來(lái)說(shuō),這都是不合理的

總結(jié)一下

單元測(cè)試好像寫的沒(méi)有之前多了,更多的是寫相對(duì)更粗粒度的接口測(cè)試,一個(gè)主要原因就是覺(jué)得寫單元測(cè)試瑣碎,寫接口測(cè)試能通就證明主流程OK,就能提測(cè)了,事實(shí)上在比較緊湊的迭代節(jié)奏里這是常態(tài),幸而測(cè)試同學(xué)的集成測(cè)試比較給力,沒(méi)出什么問(wèn)題,但其實(shí)也不能老依賴于接口測(cè)試和集成測(cè)試,單元測(cè)試也有必要寫的,更多的是通過(guò)寫單測(cè)CR下自己的代碼吧,踐行持續(xù)重構(gòu)的理念。對(duì)于代碼的可測(cè)試性而言,其實(shí)我們?nèi)粘;赟pring去開(kāi)發(fā),本身大多數(shù)場(chǎng)景都是依賴注入,所以體會(huì)可能沒(méi)有那么深,至于對(duì)于遠(yuǎn)程服務(wù)的依賴,使用二次封裝是個(gè)不錯(cuò)的方法,但是代碼侵入性還是有一些的,其實(shí)也能通過(guò)一些測(cè)試工具例如AnyMock解決。重要的還是要有單測(cè)和提高代碼可測(cè)試性的意識(shí)吧…文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-424744.html

到了這里,關(guān)于【Java設(shè)計(jì)模式 規(guī)范與重構(gòu)】 二 重構(gòu)的保障:?jiǎn)卧獪y(cè)試,以及如何提高代碼可測(cè)試性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【設(shè)計(jì)模式之美】重構(gòu)(三)之解耦方法論:如何通過(guò)封裝、抽象、模塊化、中間層等解耦代碼?

    【設(shè)計(jì)模式之美】重構(gòu)(三)之解耦方法論:如何通過(guò)封裝、抽象、模塊化、中間層等解耦代碼?

    重構(gòu)可以分為大規(guī)模高層重構(gòu)(簡(jiǎn)稱“大型重構(gòu)”)和小規(guī)模低層次重構(gòu)(簡(jiǎn)稱“小型重構(gòu)”)。 通過(guò)解耦對(duì)代碼重構(gòu),就是保證代碼不至于復(fù)雜到無(wú)法控制的有效手段。 ? 代碼是否需要“解耦”? 看修改代碼會(huì)不會(huì)牽一發(fā)而動(dòng)全身。 依賴關(guān)系是否復(fù)雜 把模塊與模塊之間

    2024年01月16日
    瀏覽(27)
  • 設(shè)計(jì)模式之美——單元測(cè)試和代碼可測(cè)性

    設(shè)計(jì)模式之美——單元測(cè)試和代碼可測(cè)性

    最可落地執(zhí)行、最有效的保證重構(gòu)不出錯(cuò)的手段應(yīng)該就是單元測(cè)試(Unit Testing)。 什么是單元測(cè)試? 單元測(cè)試由研發(fā)工程師自己來(lái)編寫,用來(lái)測(cè)試自己寫的代碼的正確性。我們常常將它跟集成測(cè)試放到一塊來(lái)對(duì)比。單元測(cè)試相對(duì)于集成測(cè)試(Integration Testing)來(lái)說(shuō),測(cè)試的粒

    2024年02月12日
    瀏覽(25)
  • 關(guān)于Selenium的網(wǎng)頁(yè)對(duì)象單元測(cè)試的設(shè)計(jì)模式

    寫在前面:經(jīng)過(guò)了實(shí)踐總結(jié)一下經(jīng)驗(yàn),心得進(jìn)行一個(gè)分享。 首先driver是可以單獨(dú)抽出來(lái)的,變成一個(gè)driver函數(shù)放在driver.py。 然后我們新建page.py,在這里我們只處理頁(yè)面的對(duì)象,因此我們創(chuàng)建頁(yè)面類在此,當(dāng)然這個(gè)頁(yè)面類需要和HTML元素和驅(qū)動(dòng)進(jìn)行組合才能形成一個(gè)頁(yè)面。 我

    2024年02月03日
    瀏覽(18)
  • JAVA設(shè)計(jì)模式----原型設(shè)計(jì)模式

    JAVA設(shè)計(jì)模式----原型設(shè)計(jì)模式

    定義 :用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。 類型 :創(chuàng)建類模式 類圖 : 原型模式主要用于對(duì)象的復(fù)制,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個(gè)條件: 實(shí)現(xiàn)Cloneable接口。在java語(yǔ)言有一個(gè)Cloneable接口,它的作用只

    2024年02月13日
    瀏覽(27)
  • Java設(shè)計(jì)模式 (三) 代理設(shè)計(jì)模式

    什么是代理設(shè)計(jì)模式? 代理設(shè)計(jì)模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許創(chuàng)建一個(gè)代理對(duì)象,用于控制對(duì)其他對(duì)象的訪問(wèn)。代理模式通常用于在訪問(wèn)對(duì)象時(shí)添加一些附加操作,而不是直接訪問(wèn)真實(shí)對(duì)象。代理模式可以在不改變?cè)碱惔a的情況下,通過(guò)引入代理類來(lái)增強(qiáng)功能。 代

    2024年02月12日
    瀏覽(26)
  • 【設(shè)計(jì)模式】Java設(shè)計(jì)模式詳細(xì)講解

    一、概述 Java設(shè)計(jì)模式是Java程序設(shè)計(jì)中一種重要的最佳實(shí)踐,它提供了一種框架和結(jié)構(gòu),可以幫助開(kāi)發(fā)者更好地理解和設(shè)計(jì)復(fù)雜的系統(tǒng)。設(shè)計(jì)模式不僅僅是一種語(yǔ)法規(guī)則,更是一種思想和方法論,它能夠幫助開(kāi)發(fā)者更好地分析、設(shè)計(jì)和實(shí)現(xiàn)軟件系統(tǒng)。 設(shè)計(jì)模式的概念最早由

    2024年02月10日
    瀏覽(19)
  • Java設(shè)計(jì)模式 (一) 模板方法設(shè)計(jì)模式

    什么是模板方法設(shè)計(jì)模式? 模板方法設(shè)計(jì)模式是一種行為型設(shè)計(jì)模式,它定義了一個(gè)算法的骨架,并將一些步驟的具體實(shí)現(xiàn)延遲到子類中。模板方法模式可以幫助確保在算法的不同部分中保持一致性,同時(shí)也允許子類根據(jù)需要進(jìn)行具體實(shí)現(xiàn)。 模板方法模式的關(guān)鍵特點(diǎn)包括:

    2024年02月12日
    瀏覽(21)
  • Java設(shè)計(jì)模式——策略模式

    Java設(shè)計(jì)模式——策略模式

    1. 策略模式簡(jiǎn)介 策略模式: 策略模式是一種行為型模式, 它將對(duì)象和行為分開(kāi), 將行為定義為一個(gè)行為接口和具體行為的實(shí)現(xiàn) 策略模式最大的特點(diǎn)是行為的變化, 行為之間可以相互替換 每個(gè)if判斷都可以理解為一個(gè)策略. 本模式是的算法可獨(dú)立于使用它的用戶而變化 2. 模式結(jié)構(gòu)

    2024年02月11日
    瀏覽(35)
  • Java設(shè)計(jì)模式——工廠模式

    Java設(shè)計(jì)模式——工廠模式

    目錄 設(shè)計(jì)模式系列文章 前言 一、簡(jiǎn)單工廠模式 二、工廠方法模式 三、抽象工廠模式 總結(jié) 最近在學(xué)習(xí)一些Java設(shè)計(jì)模式的概念,設(shè)計(jì)模式誕生的目的,我認(rèn)為是可以使得寫出的代碼具有更好的邏輯性,減少了大量冗余代碼來(lái)進(jìn)行重復(fù)而繁瑣的操作,也更好的提升了復(fù)用性。

    2023年04月13日
    瀏覽(24)
  • Java設(shè)計(jì)模式-外觀模式

    在軟件開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到復(fù)雜的系統(tǒng)和龐大的類庫(kù)。這些系統(tǒng)往往包含了大量的類和子系統(tǒng),給開(kāi)發(fā)人員帶來(lái)了挑戰(zhàn)。為了簡(jiǎn)化接口設(shè)計(jì)和提高系統(tǒng)的可用性,設(shè)計(jì)模式提供了一種名為外觀模式的解決方案。 外觀模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,旨在為復(fù)雜系統(tǒng)提供一個(gè)簡(jiǎn)

    2024年02月05日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包