需求:商品有三種折扣價,普通客戶不享受任何優惠,vip客戶享受9折優惠,超級vip客戶享受8折優惠
當沒有用到設計模式時,我們一般會採用下面的方式處理業務
int type = 1;
if(type == 1)else if(type == 2)else if(type == 3)
這樣做的好處是直觀,能以下看懂其中的邏輯關係,但是弊端更多,當要推出第四種優惠活動時,我們不得不改變原始碼,重新加else-if 判斷語句,這樣不符合開發開閉原則,耦合性太大,這時可以用策略模式來解決該問題。
抽象策略類
public inte***ce customerstrategy
具體策略類
/**
* 普通客戶
*/public class orgniccustomer implements customerstrategy
}/**
* vip客戶
*/public class vipcustomer implements customerstrategy
}/**
* 超級vip客戶
*/public class supervipcustomer implements customerstrategy
}
環境角色類
@data
@noargsconstructor
public class excutecontext
/*** 策略方法
*/public double excute()
}!
測試類
int type = 1;
excutecontext excutecontext = new excutecontext();
if(type == 1)else if(type == 2)else if(type == 3)
excutecontext.setmoney(200);
double price = excutecontext.excute();
system.out.println("最終**為:" + price);
策略模式將乙個個具體的策略繼承乙個策略介面,具體的策略方法在子策略中實現,最後通過乙個角色類來統一處理業務。
但是這並沒有解決if-else問題,細看測試類,我們不難看出,如果我們能根據型別來自動地得到不用的物件,就可以摒棄if-else的問題。我們可以想想,我們能通過不同的值獲取其對應的資料,在開發中應該是一種什麼樣的儲存方式呢。對了,就是以key-value鍵值對儲存的map,如果我們能將type和物件以map的方式儲存,在需要得到物件時通過key值我們就能的得到對應的物件了。但是怎麼儲存map呢,在這裡我介紹兩種形式以作參考。
方法一:屬性檔案 + 反射
customer:
discount :
1 : com.huace.thread.com.huace.pattern.strategy.orgniccustomer
2 : com.huace.thread.com.huace.pattern.strategy.vipcustomer
3 : com.huace.thread.com.huace.pattern.strategy.supervipcustomer
2. 屬性檔案獲取及反射得到物件
/**
* @description:
* @auther: chenmingjian
* @date: 18-10-17 16:19
*/@data
@noargsconstructor
@allargsconstructor
@configuration
@configurationproperties(prefix = "customer")
public class propertiesconfig catch (exception e) }}
return null;
}}
3.測試類
int type = 2;
excutecontext excutecontext = new excutecontext();
customerstrategy customer = propertiesconfig.getbean(type);
excutecontext.setcustomerstrategy(customer);
excutecontext.setmoney(200);
double price = excutecontext.excute();
system.out.println("最終**為:" + price);
這樣我們就可以替代if-else語句了,但是當屬性檔案中的類名被修改時,則找不到對應的物件。
方法一:列舉
1.定義列舉類
@getter
@noargsconstructor
@allargsconstructor
public enum typeenum
2.通過反射+列舉得到物件
@data
@allargsconstructor
@configuration
public class propertiesconfig
} catch (exception e) }}
return null;
}}
3.測試類
int type = 2;
excutecontext excutecontext = new excutecontext(); customerstrategy customer = propertiesconfig.getbean(type);
excutecontext.setcustomerstrategy(customer);
excutecontext.setmoney(200);
double price = excutecontext.excute();
system.out.println("最終**為:" + price);
該方法的缺點是當要增加業務時,得去列舉中新增相應的資料。 策略模式 反射
開放 封閉原則 軟體實體 類 模組 函式等等 應該可以擴充套件,但是不可修改。也就是對於擴充套件開放的,對於更改是封閉的。學習設計模式的時候對這句話的記憶很深,而且 封裝變化 這句話更是記憶深刻,但是也只是記憶深刻,這次做考試系統的時候是真的深刻體會到了。整個考試系統的變化點就是題型,不同的考試會有...
用工廠模式和策略模式代替繁瑣的if else
過多的if else 和巢狀,會使閱讀 的人很難理解到底是什麼意思。尤其是那些沒有注釋的 其次是可維護性,因為if else特別多,if else是有辦法可以消除掉的,其中比較典型的並且使用廣泛的就是借助策略模式和工廠模式,準確的說是利用這兩個設計模式的思想,徹底消滅 中的if else。傳統用if...
使用 策略模式 解決if判斷問題
1.現在有乙個需求,根據不同的傳參paycode選擇不同的支付模式 常見的if判斷如下 public string topayhtml string paycode else if weixin pay equals paycode else if xiaomi equals paycode ret...