策略模式 反射 解決多重if else if問題

2021-08-29 09:38:40 字數 3321 閱讀 6563

需求:商品有三種折扣價,普通客戶不享受任何優惠,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...