1. 程式人生 > >策略模式:會員卡功能

策略模式:會員卡功能

老闆發話了,這個季度要做 會員卡功能,我先來做做功課。

前言

 

上面這張圖是京東商城的會員體系,總共包含五種不同等級的會員,分別是註冊會員,銅牌會員,銀牌會員,黃金會員,鑽石會員。從上圖可以看出,不同等級會員享有不同的優惠服務,那麼這麼多優惠服務在程式中是怎麼實現的呢?最直接了當的方式,就是寫一堆if else去做判斷,這顯然不是最佳實現方式,很不利於後期維護。實際上這裡需要用到設計模式中的策略模式,針對不同等級的會員,每一種會員特權都拒用不同的優惠策略。

策略模式

定義演算法簇,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。

百度百科:物件有某個行為,但是在不同的場景中,該行為有不同的實現演算法。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法。

策略模式:

  • 定義了一族演算法(業務規則);

  • 封裝了每個演算法;

  • 這族的演算法可互換代替(interchangeable)。 [1] 

策略模式結構原型

策略模式的組成

應用場景(Context):

1、需要使用ConcreteStrategy提供的演算法。

2、 內部維護一個Strategy的例項。

3、 負責動態設定執行時Strategy具體的實現演算法。

4、負責跟Strategy之間的互動和資料傳遞。

抽象策略(StrategyInterface): 定義了一個公共介面,各種不同的演算法以不同的方式實現這個介面,Context使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現。

具體策略(Strategy):包裝了相關的演算法和行為。

百度百科:

—抽象策略角色: 策略類,通常由一個介面或者抽象類實現。

—具體策略角色:包裝了相關的演算法和行為。

—環境角色:持有一個策略類的引用,最終給客戶端呼叫。

具體應用場景

百度百科:

1、 多個類只區別在表現行為不同,可以使用Strategy模式,在執行時動態選擇具體要執行的行為。

2、 需要在不同情況下使用不同的策略(演算法),或者策略還可能在未來用其它方式來實現。

3、 對客戶隱藏具體策略(演算法)的實現細節,彼此完全獨立。

 

我們取上圖中的某些模組來做,會員體系有:

銅牌會員(9折,不包郵,不支援7天無理由退款)

銀牌會員(8折,不包郵,不支援7天無理由退款)

金牌會員(7折,包郵,不支援7天無理由退款)

鑽石會員(6折,包郵,支援7天無理由退款)

程式碼實現

抽象策略角色

 如果有其他的策略,就直接在這裡加介面就行了

 具體策略角色

 

 

 環境角色

 客戶端呼叫