策略模式
在策略模式(Strategy Pattern)中,一個類的行爲或其算法可以在運行時更改。這種類型的設計模式屬於行爲型模式。
在策略模式中,我們創建表示各種策略的對象和一個行爲隨着策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法。
優點:
- 算法可以自由切換。
- 避免使用多重條件判斷。 if……else……
- 擴展性良好。
缺點:
- 策略類會增多。
- 所有策略類都需要對外暴露。
使用場景:
- 如果在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式可以動態地讓一個對象在許多行爲中選擇一種行爲。
- 一個系統需要動態地在幾種算法中選擇一種。
- 如果一個對象有很多的行爲,如果不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。
類圖
代碼實例
package com.jack.idea.test.designmode;
/**
* 策略模式
*
* @author ljs.song
* @date 2018-01-03 16:42
*/
public class Strategy {
public static void main(String[] args) {
//這幾個分享者都整裝待發,隨時準備自己的分享時刻
XiaoChenTime xiaoChenTime = new XiaoChenTime();
XiaoLongTime xiaoLongTime = new XiaoLongTime();
XiaoLeiTime xiaoLeiTime = new XiaoLeiTime();
/*
如果原始的思路,需要根據時間值,分別判斷該誰執行
if(time == 1){
xiaoChenTime.share();
}else if(time == 2){
xiaoLongTime.share();
}else if(time == 3){
xiaoLeiTime.share();
}*/
//今天是週二四點,由小臣來分享
SwitchTimeContext switchTimeContext = new SwitchTimeContext(xiaoChenTime);
switchTimeContext.share();
//今天是週四四點,由小龍來分享
SwitchTimeContext switchTimeContext2 = new SwitchTimeContext(xiaoLongTime);
switchTimeContext2.share();
//今天是週四四點半,由小磊來分享
SwitchTimeContext switchTimeContext3 = new SwitchTimeContext(xiaoLeiTime);
switchTimeContext3.share();
}
}
/**
* 策略接口
*/
interface WhichTimeShare{
//策略方法,分享
void share();
}
/**
* 小臣分享時刻
*/
class XiaoChenTime implements WhichTimeShare{
@Override
public void share() {
System.out.println("小臣分享xxxx");
}
}
/**
* 小龍分享時刻
*/
class XiaoLongTime implements WhichTimeShare{
@Override
public void share() {
System.out.println("小龍showTime 自動化測試");
}
}
/**
* 小磊分享時刻
*/
class XiaoLeiTime implements WhichTimeShare{
@Override
public void share() {
System.out.println("小磊分享時間 hadoop");
}
}
/**
* 分配時間上下文
* 這裏可以利用spring ioc來切換具體的whichTimeShare 實例,從而達到替換if……else……
*/
class SwitchTimeContext{
private WhichTimeShare whichTimeShare;
/**
* 這裏場景需要,更換不同的策略實例來完成目標任務
* @param whichTimeShare
*/
public SwitchTimeContext(WhichTimeShare whichTimeShare) {
this.whichTimeShare = whichTimeShare;
}
public void share(){
this.whichTimeShare.share();
}
}