淺談Java常見設(shè)計模式(五)
星辰鬧成一串 月色笑成一彎
傻傻望了你一晚 怎么看都不覺得煩??愛自己不到一半 心都在你身上??只要能讓你快樂 我可以拿一切來換
在SpringMVC三層架構(gòu)的項目中,已然習(xí)慣于前端寫一個請求,后端對應(yīng)有個controller來執(zhí)行這個請求的模式了,那么今天就先仿制下這個模式。
那么首先,需要有一個統(tǒng)一的入口來收集這些請求,所有需要處理的請求都先要傳入到這個入口中,然后這個入口類會根據(jù)獲取到的請求的類型,分配到對相應(yīng)的控制器去處理。
這里簡化下這個過程,程序接收到一個字符串參數(shù),然后根據(jù)這個參數(shù),對應(yīng)找到自己的處理器
首先定義兩個處理器AController、BController實現(xiàn)公共接口Controller

AController、BController


然后是這個Dispatch:

客戶端調(diào)用:

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

這里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:

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


還有一個空的策略:

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

看下測試類:

根據(jù)不同的關(guān)鍵字,來選擇不同的策略,同時執(zhí)行響應(yīng)的策略。
這里,把這種模式稱為策略模式:

上述代碼,其實可以利用前面說到的一些設(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();????}}
然后測試類:

這個時候,代碼就簡單明了許多了。。。。。。也比較好維護(hù)些了。
歡迎多多指教
點個贊再走了,謝謝!
評論
圖片
表情
