精通Java设计模式从初见到相爱之工厂+策略模式(3)
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
1、公司項(xiàng)目需求。
????用戶簽到活動(dòng),會(huì)員簽到怎么處理,超級(jí)會(huì)員怎么處理,普通用戶簽到怎么處理,針對(duì)不同的檔次,有不同的方案,所以在項(xiàng)目中用到了策略模式以及簡(jiǎn)單工廠模式。
? ? 其實(shí)生活中,我們用到的軟件系統(tǒng)都會(huì)有這樣的制定級(jí)別,比如我們是實(shí)體店,他也有一個(gè)會(huì)員制度,打9折,打七折,打六折的都有,包括我們做頭發(fā),也都有不同級(jí)別的剪發(fā)卡.... 這些理發(fā)店啊、服裝店啊還有什么美容spa店等等用的軟件都會(huì)涉及,這就是我們所說的策略模式。
2、策略模式的概念
? ? 概念:針對(duì)一類問題,用不同的方式的解決,這就是策略模式!
? ? 舉例1:明星演唱會(huì),我們?nèi)ベI門票,路人甲買的一等座,路人乙買的二等座,路人丙買的外圍座,雖然他們都能看到明星演唱,但是位置不同,針對(duì)買座位的不同級(jí)別來設(shè)置他們的觀看明星位置,就是策略模式!
? ? 舉例2:去李寧專賣店買衣服,路人甲和路人乙買同一件衣服,雖然都能買到衣服,但是路人甲是會(huì)員,路人乙是普通用戶,他們支付的錢不一樣,路人甲花錢少,針對(duì)買衣服不同人的級(jí)別折扣不一樣,就是策略模式!
3、代碼實(shí)現(xiàn)
? ? 項(xiàng)目中用到的比較多,例如商城會(huì)員、簽到級(jí)別、游戲上、這種項(xiàng)目用的策略設(shè)計(jì)模式比較多
? ? 說個(gè)場(chǎng)景,服裝店,買衣服,會(huì)員級(jí)別分別是:AVip、BVip、CVip 和沒有會(huì)員的用戶NoVip,四個(gè)級(jí)別,打折情況分別是0.6、0.7、0.9和沒有打折
? ? 打折的接口
public interface DisCount {//買東西給折扣Double disCount(Double money); }不同會(huì)員級(jí)別的實(shí)現(xiàn)類,不同的折扣
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 {//客戶消費(fèi)總金額private Double totalAccount =0D;//客戶目前消費(fèi)金額private Double currentAccount = 0D;//默認(rèn)消費(fèi)者 沒有會(huì)員等級(jí)private DisCount disCount = new NoVip();//消費(fèi)者 消費(fèi)商品、衣服的方法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();}}// 消費(fèi)者支付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函數(shù)中執(zhí)行:
package ceLve;public class Main {public static void main(String[] args){Customer customer = new Customer();customer.buy(5000.00);System.out.println(customer.pay());} }運(yùn)行結(jié)果:4500.00
????上面是純粹的是策略模式,現(xiàn)在我要加上簡(jiǎn)單工廠模式,其實(shí)加上與不加上沒有什么區(qū)別,就自我感覺就是吃飯為什么非要用右手使用筷子,而不是左手,小時(shí)候家長(zhǎng)我只要用左手就打我手。因?yàn)槲覀冎袊?guó)的傳統(tǒng)就是右手,所以因?yàn)閭鹘y(tǒng)的原因,目前簡(jiǎn)單工廠設(shè)計(jì)模式也如此,也基本沒什么用,但有人會(huì)說硬編碼,不能隨隨便便new,那好吧,今天把簡(jiǎn)單工廠模式也加進(jìn)去。
? ? 修改方案:修改Customer類,新增簡(jiǎn)單工廠類CountFactory
package ceLve;public class Customer {//客戶消費(fèi)總金額private Double totalAccount =0D;//客戶目前消費(fèi)金額private Double currentAccount = 0D;//默認(rèn)消費(fèi)者 沒有會(huì)員等級(jí)private DisCount disCount = new NoVip();//消費(fèi)者 消費(fèi)商品、衣服的方法public void buy(Double money){this.currentAccount = money;totalAccount += money;disCount = CountFactory.createCount(this);}// 消費(fèi)者支付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函數(shù)代碼不變
結(jié)果依然4500.00
其實(shí)大家看下來就感覺沒那么多必要的,我直接if else也可以解決的,沒有這么麻煩呀,不對(duì)的,簡(jiǎn)單的小項(xiàng)目可以這樣,但是如果活動(dòng)量增加的話,沒必要在controller或者service層去判斷它應(yīng)用那種策略,他其實(shí)說白了就是一個(gè)處理方式的一個(gè)工具類!我們把它封裝好,什么時(shí)候用,什么時(shí)候調(diào)用就好,就像jdk中的時(shí)間,其實(shí)我們項(xiàng)目中也會(huì)有很多工具類,他其實(shí)有點(diǎn)類似那樣!
????
?
轉(zhuǎn)載于:https://my.oschina.net/mdxlcj/blog/1787501
總結(jié)
以上是生活随笔為你收集整理的精通Java设计模式从初见到相爱之工厂+策略模式(3)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python 中的os模块
- 下一篇: 抽象工厂模式(Absraact Fact
