在實(shí)現(xiàn)策略模式的時(shí)候,我們習(xí)慣用switch-case來代替if-else if-else,在代碼結(jié)構(gòu)上會(huì)更加清晰,但這也只是從代碼結(jié)構(gòu)這個(gè)層面上來考慮,我們可以從代碼速度上來考慮設(shè)計(jì)問題。

    無論是switch-case還是if-else if-else的設(shè)計(jì),都會(huì)遇到一個(gè)問題:如果判斷的條件很多,假設(shè)是n個(gè),而滿足的條件恰好是最后一個(gè),那么代碼的執(zhí)行效率就是o(n)。

    為了找到一個(gè)能夠執(zhí)行的代碼,我們實(shí)際上是判斷了n次,當(dāng)然,這個(gè)判斷其實(shí)是很快的,一般情況下的效率折損是不用考慮的,就算判斷條件很多,但涉及那么多判斷條件的業(yè)務(wù)場(chǎng)景,本身就是個(gè)災(zāi)難了。

    我們可以通過一種數(shù)據(jù)結(jié)構(gòu)來解決這個(gè)問題。

    策略模式的目的就是根據(jù)某種類型尋找對(duì)應(yīng)的策略,如果將該類型理解為key,而策略就是value的話,我們很快就能明白,這就是key-value的查找。

    key-value的容器類自然想到HashMap。

    在我們之前的文章 http://www.cnblogs.com/wenjiang/p/6019000.html 中提到了一個(gè)業(yè)務(wù)場(chǎng)景,就是根據(jù)對(duì)應(yīng)的廣告平臺(tái)尋找對(duì)應(yīng)的平臺(tái)調(diào)用方法。這里利用HashMap來重新整理我們的代碼結(jié)構(gòu)。

    我們定義了Enum類ShowType表示要展示的廣告類型,然后各種類型的Controller就是對(duì)應(yīng)的策略類。

Map<ShowType, Object> controllerMap = new HashMap();
controllerMap.put(ShowType.Banner, createBannerProperties(activity, slotId, viewGroup, platforms);
...

    我們定義一個(gè)ShowType為key值,Controller為value值的HashMap,然后將對(duì)應(yīng)的key-value放進(jìn)去。

    原先我們是根據(jù)傳進(jìn)來的ShowType返回對(duì)應(yīng)的Controller:

網(wǎng)友評(píng)論