各種設計模式--應用場景:
裝飾器模式:
1、類繼承會導致類的膨脹,這時候裝飾器就派上用場了裝飾器模式:
責任鏈模式:
1、ifelse 用責任鏈來實現
狀態模式:1、ifelse
適配器模式:目的是在原來代碼的基礎上面,增加一些修飾的東西。
1、訂單信息,比如增加了活動了之后,返回結果中要包含活動信息,在原來代碼的基礎上面給返回的Bean里面增加一些活動信息。
代理模式:
比如吧,我有一個業務,同時要調用外部系統的http實現的接口和webservice實現的接口,可以做一個代理類, 代理webservice接口和http接口, 代理類幫我判斷該用哪個, 我直接調用代理類就行了。代理類專門屏蔽后面的接口或者協議。
模板方法模式:1、比如訂單的下單還有退款操作,都需要同時判斷使用的金額和紅包。
2、支付的時候,調用不同的支付方式,都需要去做判斷。
策略模式:
策略模式和裝飾器模式區別:
策略模式偏向于對實現方法或策略的封裝,調用者不需要考慮具體實現,只要指定使用的策略即可。
裝飾器模式一般用于需要對功能進行擴展的場合,每一種裝飾都是一種擴展或增強。
看起來兩個模式好像沒有必然的聯系,但是在實際使用過程中,發現了一個讓我困惑的地方。
先看一個典型的場景:
商場對客戶打折,老客戶8折,新客戶9折,新客戶購物滿3000,打8.5折
對這個基本場景,一般給的經典模式是策略模式,很多書也以這個作為策略模式的的經典案例。
但是,如果我把每一種折扣看作是一種對原有價格的裝飾,這個場景也是可以用裝飾器模式實現的。
兩個模式都需要花費一些代碼去判斷策略或裝飾器的類型,而且實現難度也旗鼓相當。
我用兩種模式都實現了相同的功能,但是卻沒有發現明顯的區別,不知道大家對這兩個模式怎么看,
歡迎討論。
盡管樓主可以使用兩種模式實現自己說的場景,但是兩者還是有本質的區別。策略模式偏向于對實現方法或策略的封裝,調用者不需要考慮具體實現,只要指定使用的策略即可。
裝飾器模式一般用于需要對功能進行擴展的場合,每一種裝飾都是一種擴展或增強。
看起來兩個模式好像沒有必然的聯系,但是在實際使用過程中,發現了一個讓我困惑的地方。
先看一個典型的場景:
商場對客戶打折,老客戶8折,新客戶9折,新客戶購物滿3000,打8.5折
對這個基本場景,一般給的經典模式是策略模式,很多書也以這個作為策略模式的的經典案例。
但是,如果我把每一種折扣看作是一種對原有價格的裝飾,這個場景也是可以用裝飾器模式實現的。
兩個模式都需要花費一些代碼去判斷策略或裝飾器的類型,而且實現難度也旗鼓相當。
我用兩種模式都實現了相同的功能,但是卻沒有發現明顯的區別,不知道大家對這兩個模式怎么看,
歡迎討論。
策略模式更傾向是N選1的模式,也即根據條件選擇相應的算法,但各種算法是互斥的,比如:團體客戶和個人客戶的優惠政策必然是非此即彼的;
裝飾模式是在主體邏輯的基礎上的附加邏輯,比如,個人客戶有的屬于同城客戶,支持送貨上門。
裝飾模式是在主體邏輯的基礎上的附加邏輯,比如,個人客戶有的屬于同城客戶,支持送貨上門。
謝謝您的回復,如果按照策略模式,每一種打折方案是一種策略,而且只能選擇一個,這是沒有問題的。
按照裝飾模式,每一種折扣都是在購買金額上的附加,在沒有折上折或者送貨上門這些附加值的時候,我感覺裝飾模式也是實用的,當然,當折上折和送貨這種附加體現的時候,裝飾起的模式就體現去來了。
所以,我感覺在當前描述的問題中,這兩個模式應該都可以很恰當的實現需求,但是沒感覺到本質的區別。
于是就有些困惑了,看了您的總結,我感覺自己有點鉆牛角了。
如果這個場景新增附加需求,比如新增vip客戶,那么策略模式就比較合適了。
但是如果進行折上折或者送貨上門這類附加需求,很明顯裝飾模式會更好一些了。
看來具體的模式還得根據實際需求確定,不能死搬硬套。
按照裝飾模式,每一種折扣都是在購買金額上的附加,在沒有折上折或者送貨上門這些附加值的時候,我感覺裝飾模式也是實用的,當然,當折上折和送貨這種附加體現的時候,裝飾起的模式就體現去來了。
所以,我感覺在當前描述的問題中,這兩個模式應該都可以很恰當的實現需求,但是沒感覺到本質的區別。
于是就有些困惑了,看了您的總結,我感覺自己有點鉆牛角了。
如果這個場景新增附加需求,比如新增vip客戶,那么策略模式就比較合適了。
但是如果進行折上折或者送貨上門這類附加需求,很明顯裝飾模式會更好一些了。
看來具體的模式還得根據實際需求確定,不能死搬硬套。
策略模式,已經說的很清楚, 就不多說了。
裝飾模式是主題邏輯的基礎上的加強。可以看看JAVA IO的設計。
就像樓上說的, 如果客戶購買滿5000, 不只可以享受7折優惠, 還可以送貨上門。
這里有兩項功能: 1) 7折優惠, 2)送貨上門
如果使用策略模式, 我們勢必把兩項功能都寫在一個策略的實現類里面。
假使現在有新的場景出現,就是老客戶購買滿3000, 也享受送貨上門。(或者說這里面的還蘊藏一些其他的優惠,比如說返券等等)
難道我們又把這些功能添加到我們的策略里面, 這樣代碼就很生硬而且不容易修改。
但是使用裝飾模式就不一樣,裝飾模式能動態的給對象增加特有的功能。 比如說IO里面可以添加Buffer的功能。 同樣在我們的場景里面,我們也可以將送貨上門、返券等也動態的增強, new 送貨上門(new 返券())...., 這樣子就很靈活了。
策略實現可能類似:
do7折();
do送貨上門();
do返券()
裝飾的實現可能了類似:
new 7折( new 送貨上門(new 返券())), 能隨意組合;
所有的優惠都享受上了, 看上去還是爽一點。
其實裝飾模式, 還是更符合設計的一條原則: 少繼承, 多組合