策略模式
定義
該模式定義了一系列算法,并將每個算法封裝起來,使他們可以相互替換,且算法的變化不會影響使用算法的客戶。策略模式屬于對象行為模式,它通過對算法進行封裝,把使用算法的責(zé)任和算法的實現(xiàn)分隔開,并委派給不同的對象對這些算法進行管理。
結(jié)構(gòu)
抽象策略類(Strategy):這是一個抽象角色,通常由一個接口或者抽象類實現(xiàn)。此角色給出所有的具體策略類所需的接口。
具體策略類(Concrete Strategy):實現(xiàn)了抽象策略定義的接口,提供具體的算法實現(xiàn)或行為。
環(huán)境類(Context):持有一個策略類的引用,最終給客戶端調(diào)用。
案例
推銷員上面推銷產(chǎn)品,有多種推銷方案,對不同的人使用不同的方案。
類圖:文章來源:http://www.zghlxwxcb.cn/news/detail-758578.html
/**
* 抽象策略類
*/
public interface Strategy {
void show();
}
/**
* 具體策略類 封裝算法
*/
public class StrategyA implements Strategy{
@Override
public void show() {
System.out.println("買一送二");
}
}
/**
* 具體策略類 封裝算法
*/
public class StrategyB implements Strategy{
@Override
public void show() {
System.out.println("滿200減20");
}
}
/**
* 具體策略類 封裝算法
*/
public class StrategyC implements Strategy{
@Override
public void show() {
System.out.println("8.8折");
}
}
/**
* 促銷類 環(huán)境類
*/
public class SalesMan {
// 聚合策略類
private Strategy strategy;
public SalesMan(Strategy strategy) {
this.strategy = strategy;
}
// 給用戶展示促銷活動
public void SalesManShow(){
strategy.show();
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
public class Test01 {
public static void main(String[] args) {
// 使用a促銷方案
SalesMan salesMan = new SalesMan(new StrategyA());
salesMan.SalesManShow();
// 使用b促銷方案
salesMan.setStrategy(new StrategyB());
salesMan.SalesManShow();
// 使用c促銷方案
salesMan.setStrategy(new StrategyC());
salesMan.SalesManShow();
}
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-758578.html
優(yōu)缺點
- 優(yōu)點
- 策略類之間可以自由切換,由于策略類都實現(xiàn)同一個接口,所以它們之間可以自由切換。
- 易于擴展,增加一個新的策略只需要添加一個具體的策略類即可,基本不需要改變原有的代碼,符合開閉原則。避免使用多重條件語句(if else),充分體現(xiàn)面向?qū)ο笤O(shè)計思想
- 缺點
- 客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
- 策略模式將造成產(chǎn)生很多策略類,可以通過使用享元模式在一定程度上減少對象的數(shù)量。
使用場景
- 一個系統(tǒng)需要動態(tài)的在幾種算法選擇一種時,可將每個算法封裝到策略模式中。
- 一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn),可將每個條件分支移入它們各自的策略類中以代替這些條件語句。
- 系統(tǒng)中個算法彼此獨立,且要求對客戶隱藏具體算法的實現(xiàn)細節(jié)時。
- 系統(tǒng)要求使用算法的客戶不應(yīng)該知道該操作的數(shù)據(jù)時,可使用策略模式來隱藏與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
- 多個類只區(qū)別在表現(xiàn)行為不同,可以使用策略模式,在運行時動態(tài)選擇具體要執(zhí)行的行為。
到了這里,關(guān)于【設(shè)計模式--行為型--策略模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!