<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          淺談Java常見設(shè)計模式(五)

          共 2718字,需瀏覽 6分鐘

           ·

          2021-04-30 08:27

          星辰鬧成一串 月色笑成一彎
          傻傻望了你一晚 怎么看都不覺得煩??愛自己不到一半 心都在你身上??只要能讓你快樂 我可以拿一切來換

          在SpringMVC三層架構(gòu)的項目中,已然習(xí)慣于前端寫一個請求,后端對應(yīng)有個controller來執(zhí)行這個請求的模式了,那么今天就先仿制下這個模式。

          那么首先,需要有一個統(tǒng)一的入口來收集這些請求,所有需要處理的請求都先要傳入到這個入口中,然后這個入口類會根據(jù)獲取到的請求的類型,分配到對相應(yīng)的控制器去處理。
          這里簡化下這個過程,程序接收到一個字符串參數(shù),然后根據(jù)這個參數(shù),對應(yīng)找到自己的處理器
          首先定義兩個處理器AController、BController實現(xiàn)公共接口Controller

          29e34c60fa695bc829d22e5ee571deb4.webp


          AController、BController

          14b21a691a519e358c895091525ce71e.webp


          6f866656f6d41402c9ed6f65204c8558.webp


          然后是這個Dispatch:

          be94e56a753894b491952a863e4d11ac.webp


          客戶端調(diào)用:

          b73499c511fd68ba4a8d96340d10a455.webp


          這里,根據(jù)request的請求url,經(jīng)過Dispatch接收處理,然后分配到對應(yīng)的處理器中處理。

          讓我們看下類圖:

          6ff43851642985dd21dc5d362285b2cf.webp


          這里Dispatch,持有多個Controller的實現(xiàn),然后接收到具體的任務(wù),下發(fā)到具體的實現(xiàn)中去,這就是一個簡單的委派(Delegate)。

          委派模式,其實并非23種設(shè)計模式中的一種,但是它的實用性,卻體現(xiàn)在很多的框架中,比如我們所以熟知的SpringMVC,其中有個DispatchServlet就是一個委派的較好體現(xiàn),當(dāng)web端的請求到達(dá)后端,通過DispatchServlet分發(fā)給不同的Controler處理。


          上述過程,其實還通過另外一種方式來實現(xiàn)---策略,這里根據(jù)請求的關(guān)鍵字,調(diào)用響應(yīng)的處理器處理,可以類比的把這些處理器,當(dāng)做一個一個的策略,相應(yīng)的,根據(jù)關(guān)鍵字,得到響應(yīng)的策略

          下面通過這種方式來實現(xiàn)下這個過程:
          首先有一個抽象的Strategy:

          935982d6c947db544e4d9823de1493e1.webp



          然后這里模擬了3種策略,分別是A、B和一個空的策略

          921296a7a5cf81e07cc94a6282b2a693.webp


          3d841fdc22c613b6a8caa502fbf915db.webp


          還有一個空的策略:


          a76608b9ddddf19d6f9a032058e4112e.webp


          然后這里需要一個統(tǒng)一執(zhí)行器根據(jù)不同的策略來執(zhí)行請求:

          890769b3550a115f0120d505da0d7f6e.webp


          看下測試類:

          aabd159a41d6c71fdb1b8649589f2d25.webp


          根據(jù)不同的關(guān)鍵字,來選擇不同的策略,同時執(zhí)行響應(yīng)的策略。

          這里,把這種模式稱為策略模式:

          62e15efab69837dd2ff118c6539a02d2.webp


          上述代碼,其實可以利用前面說到的一些設(shè)計模式,進(jìn)行一定的優(yōu)化,比如根據(jù)關(guān)鍵字選擇什么策略的時候,完全可以使用工廠模式來實現(xiàn)。

          那么改造下上述過程,3種策略不變,這里新建一個策略工廠類StrategyFactory:

          package com.lgli.behavior.delegatestrategy.v3;

          import java.util.HashMap;import java.util.Map;
          /** * * 策略工廠 * @author lgli */

          public class StrategyFactory {
          private static final StrategyFactory strategyFactory = new StrategyFactory();
          private static final ControllerStrategy EMPTY_STRATEGY = new EControllerStrategy();
          private StrategyFactory(){}
          private static final Map<String,ControllerStrategy> map = new HashMap<>();
          static { map.put(StrategyKey.A.name(), new AControllerStrategy()); map.put(StrategyKey.B.name(), new BControllerStrategy()); map.put(StrategyKey.EMPTY.name(), new EControllerStrategy()); }
          public static StrategyFactory getInstance(){ return strategyFactory; }
          public ControllerStrategy getStrategy(String key){ ControllerStrategy controllerStrategy = map.get(key); return controllerStrategy == null ? EMPTY_STRATEGY : controllerStrategy; }
          enum StrategyKey{ A,B,EMPTY }
          }

          策略工廠使用餓漢式單例,然后先將所有的策略全部緩存起來


          對外提供實例化工廠實例方法getInstance和根據(jù)key獲取對應(yīng)的策略方法getStrategy


          請求處理器類DealController<委派類>:


          package com.lgli.behavior.delegatestrategy.v3;

          /** * @author lgli */public class DealController {
          private static final DealController dealController = new DealController();
          private DealController(){}
          public static DealController getInstance(){ return dealController; }
          public void deal(String key){ StrategyFactory strategyFactory = StrategyFactory .getInstance(); ControllerStrategy strategy = strategyFactory .getStrategy(key); strategy.deal();????}}

          然后測試類:

          c574823d733a7aa3a4734945e240c933.webp


          這個時候,代碼就簡單明了許多了。。。。。。也比較好維護(hù)些了。



          歡迎多多指教

          點個贊再走了,謝謝!


          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  怡红院在线播放 | 琪琪婷婷五月色综合 | 国产一级毛片视频 | 中文不卡视频 | 一级片在线观看视频 |