為什么80%的碼農都做不了架構師?>>> ??
1、公司項目需求。
????用戶簽到活動,會員簽到怎么處理,超級會員怎么處理,普通用戶簽到怎么處理,針對不同的檔次,有不同的方案,所以在項目中用到了策略模式以及簡單工廠模式。
? ? 其實生活中,我們用到的軟件系統都會有這樣的制定級別,比如我們是實體店,他也有一個會員制度,打9折,打七折,打六折的都有,包括我們做頭發,也都有不同級別的剪發卡.... 這些理發店啊、服裝店啊還有什么美容spa店等等用的軟件都會涉及,這就是我們所說的策略模式。
2、策略模式的概念
? ? 概念:針對一類問題,用不同的方式的解決,這就是策略模式!
? ? 舉例1:明星演唱會,我們去買門票,路人甲買的一等座,路人乙買的二等座,路人丙買的外圍座,雖然他們都能看到明星演唱,但是位置不同,針對買座位的不同級別來設置他們的觀看明星位置,就是策略模式!
? ? 舉例2:去李寧專賣店買衣服,路人甲和路人乙買同一件衣服,雖然都能買到衣服,但是路人甲是會員,路人乙是普通用戶,他們支付的錢不一樣,路人甲花錢少,針對買衣服不同人的級別折扣不一樣,就是策略模式!
3、代碼實現
? ? 項目中用到的比較多,例如商城會員、簽到級別、游戲上、這種項目用的策略設計模式比較多
? ? 說個場景,服裝店,買衣服,會員級別分別是:AVip、BVip、CVip 和沒有會員的用戶NoVip,四個級別,打折情況分別是0.6、0.7、0.9和沒有打折
? ? 打折的接口
public interface DisCount {//買東西給折扣Double disCount(Double money); }
不同會員級別的實現類,不同的折扣
package ceLve;public class AVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.6 ;} }
package ceLve;public class BVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.7;} }
package ceLve;public class CVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.9;} }
package ceLve;public class NoVip implements DisCount {//普通用戶不能打折@Overridepublic Double disCount(Double money) {return money;} }
package ceLve;public class Customer {//客戶消費總金額private Double totalAccount =0D;//客戶目前消費金額private Double currentAccount = 0D;//默認消費者 沒有會員等級private DisCount disCount = new NoVip();//消費者 消費商品、衣服的方法public void buy(Double money){this.currentAccount = money;totalAccount += money;if (totalAccount >= 10000){disCount= new AVip();}else if (totalAccount >= 6000){disCount= new BVip();}else if (totalAccount >= 3000){disCount= new CVip();}else {disCount= new NoVip();}}// 消費者支付public double pay(){return disCount.disCount(currentAccount);}public Double getTotalAccount() {return totalAccount;}public void setTotalAccount(Double totalAccount) {this.totalAccount = totalAccount;}public Double getCurrentAccount() {return currentAccount;}public void setCurrentAccount(Double currentAccount) {this.currentAccount = currentAccount;}}
最后在main函數中執行:
package ceLve;public class Main {public static void main(String[] args){Customer customer = new Customer();customer.buy(5000.00);System.out.println(customer.pay());} }
運行結果:4500.00
????上面是純粹的是策略模式,現在我要加上簡單工廠模式,其實加上與不加上沒有什么區別,就自我感覺就是吃飯為什么非要用右手使用筷子,而不是左手,小時候家長我只要用左手就打我手。因為我們中國的傳統就是右手,所以因為傳統的原因,目前簡單工廠設計模式也如此,也基本沒什么用,但有人會說硬編碼,不能隨隨便便new,那好吧,今天把簡單工廠模式也加進去。
? ? 修改方案:修改Customer類,新增簡單工廠類CountFactory
package ceLve;public class Customer {//客戶消費總金額private Double totalAccount =0D;//客戶目前消費金額private Double currentAccount = 0D;//默認消費者 沒有會員等級private DisCount disCount = new NoVip();//消費者 消費商品、衣服的方法public void buy(Double money){this.currentAccount = money;totalAccount += money;disCount = CountFactory.createCount(this);}// 消費者支付public double pay(){return disCount.disCount(currentAccount);}public Double getTotalAccount() {return totalAccount;}public void setTotalAccount(Double totalAccount) {this.totalAccount = totalAccount;}public Double getCurrentAccount() {return currentAccount;}public void setCurrentAccount(Double currentAccount) {this.currentAccount = currentAccount;}}
public class CountFactory {private CountFactory(){}public static DisCount createCount(Customer customer){if (customer.getTotalAccount() >= 10000){return new AVip();}else if (customer.getTotalAccount() >= 6000){return new BVip();}else if (customer.getTotalAccount() >= 3000){return new CVip();}else {return new NoVip();}} }
main函數代碼不變
結果依然4500.00
其實大家看下來就感覺沒那么多必要的,我直接if else也可以解決的,沒有這么麻煩呀,不對的,簡單的小項目可以這樣,但是如果活動量增加的話,沒必要在controller或者service層去判斷它應用那種策略,他其實說白了就是一個處理方式的一個工具類!我們把它封裝好,什么時候用,什么時候調用就好,就像jdk中的時間,其實我們項目中也會有很多工具類,他其實有點類似那樣!
????
?