<optgroup id="6y7f6"><small id="6y7f6"></small></optgroup>

<code id="6y7f6"></code>

  • <p id="6y7f6"><tbody id="6y7f6"><ins id="6y7f6"></ins></tbody></p>
    <code id="6y7f6"><form id="6y7f6"></form></code>

      最容易懂的策略模式消除if-else分支,實現開閉原則,提高可擴展性

      1 介紹

      策略模式最常用的場景就是用于消除代碼中的if-else,這里所說的if-else并不是說任何簡單的判斷都引入策略模式來優化,這樣反而會增加代碼的復雜度。

      反例:使用策略模式對一個boolean類型的變量進行優化

      2 背景

      我負責的有一個基于流程引擎開發的項目,有一個功能模塊是查看申請單的詳情,由于不同的申請單展示的信息各不相同,最開始負責這部分功能開發的同學使用if-else來判斷申請單的類型,并對不同的申請單做不同的處理。

      由于系統中的申請單越來越多,這部分的if-else分支也變得臃腫,而且每次新增申請單的時候,都需要在后面再加一個分支,不僅破壞了開閉原則,而且可讀性極差,也不利于擴展。

      3 引入策略接口

      不同的申請單有自己處理detail的邏輯,實現這個策略接口,重寫 doDetail()即可

      這是一個默認實現:

      4 引入策略上下文對象

      有了策略接口后,現在需要一個上下文對象將所有的策略放在一個集合中,方便后續調用

      這里使用了 spring 框架提供的 applycationContext 來獲取策略接口的所有實現類,在策略上下文對象完成初始化后,將實現類注冊到 map 中。(@PostConstruct:在bean初始化完成后處理一些邏輯)

      5 客戶端調用

      只要持有 策略上下文對象,就能拿到策略接口的實現類,從而執行相關邏輯:

      6 總結

      后續開發的同學添加申請單的時候,只需要新增一個詳情類,實現策略接口,重寫方法即可,大大提高了這部分功能的擴展性。

      關于策略上下文對象使用集合存儲所有策略的解釋:使用 Map 來存儲,需要一個key來標識使用哪種策略來處理。

      posted @ 2023-02-04 17:32  fengzeng  閱讀(468)  評論(2編輯  收藏  舉報
      欧洲黄色网页链接入口,免费A级毛片无码无遮挡久久影院,a免费黄色网址,国产一级黄色的网站
      <optgroup id="6y7f6"><small id="6y7f6"></small></optgroup>

      <code id="6y7f6"></code>

    1. <p id="6y7f6"><tbody id="6y7f6"><ins id="6y7f6"></ins></tbody></p>
      <code id="6y7f6"><form id="6y7f6"></form></code>