策略模式:會員卡功能
老闆發話了,這個季度要做 會員卡功能,我先來做做功課。
前言
上面這張圖是京東商城的會員體系,總共包含五種不同等級的會員,分別是註冊會員,銅牌會員,銀牌會員,黃金會員,鑽石會員。從上圖可以看出,不同等級會員享有不同的優惠服務,那麼這麼多優惠服務在程式中是怎麼實現的呢?最直接了當的方式,就是寫一堆if else去做判斷,這顯然不是最佳實現方式,很不利於後期維護。實際上這裡需要用到設計模式中的策略模式,針對不同等級的會員,每一種會員特權都拒用不同的優惠策略。
策略模式
定義演算法簇,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。
百度百科:物件有某個行為,但是在不同的場景中,該行為有不同的實現演算法。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法。
策略模式:
策略模式結構原型
策略模式的組成
應用場景(Context):
1、需要使用ConcreteStrategy提供的演算法。
2、 內部維護一個Strategy的例項。
3、 負責動態設定執行時Strategy具體的實現演算法。
4、負責跟Strategy之間的互動和資料傳遞。
抽象策略(StrategyInterface): 定義了一個公共介面,各種不同的演算法以不同的方式實現這個介面,Context使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現。
具體策略(Strategy):包裝了相關的演算法和行為。
百度百科:
—抽象策略角色: 策略類,通常由一個介面或者抽象類實現。
—具體策略角色:包裝了相關的演算法和行為。
—環境角色:持有一個策略類的引用,最終給客戶端呼叫。
具體應用場景
百度百科:
1、 多個類只區別在表現行為不同,可以使用Strategy模式,在執行時動態選擇具體要執行的行為。
2、 需要在不同情況下使用不同的策略(演算法),或者策略還可能在未來用其它方式來實現。
3、 對客戶隱藏具體策略(演算法)的實現細節,彼此完全獨立。
我們取上圖中的某些模組來做,會員體系有:
銅牌會員(9折,不包郵,不支援7天無理由退款)
銀牌會員(8折,不包郵,不支援7天無理由退款)
金牌會員(7折,包郵,不支援7天無理由退款)
鑽石會員(6折,包郵,支援7天無理由退款)
程式碼實現
抽象策略角色
如果有其他的策略,就直接在這裡加介面就行了
具體策略角色
環境角色
客戶端呼叫