定義
策略是為達(dá)到某一目的而采取的手段或方法哪亿,策略模式的本質(zhì)是目標(biāo)與手段的分離桨醋,手段不同而最終達(dá)成的目標(biāo)一致檩电≈舴幔客戶只關(guān)心目標(biāo)而不在意具體的實(shí)現(xiàn)方法府树,實(shí)現(xiàn)方法要根據(jù)具體的環(huán)境因素而變化。
C#例子
// 上傳附件策略
public abstract class Strategy
{
// 上傳附件
public abstract void UpLoad();
}
// 使用阿里云的策略
public class AliYunStrategy : Strategy
{
public override void UpLoad()
{
Console.WriteLine("我把數(shù)據(jù)存到了阿里云料按!");
}
}
// 本地策略
public class LocalStrategy : Strategy
{
public override void UpLoad()
{
Console.WriteLine("我把數(shù)據(jù)存到了本地文件夾奄侠!");
}
}
public class MongoDbStrategy : Strategy {
public override void UpLoad()
{
Console.WriteLine("我把數(shù)據(jù)存到了芒果數(shù)據(jù)庫(kù)!");
}
}
public class Context
{
private Strategy _strategy;
public Context(Strategy strategy) {
_strategy = strategy;
}
public void UploadFile() {
_strategy.UpLoad();
}
}
static void Main(string[] args)
{
new Context(new AliYunStrategy()).UploadFile();
new Context(new LocalStrategy()).UploadFile();
new Context(new MongoDbStrategy()).UploadFile();
Console.ReadLine();
}
策略模式參與者:
- Strategy 策略: 定義所支持的算法的公共接口载矿。Context使用這個(gè)接口來調(diào)用某個(gè)*Strategy定義的算法垄潮。
- *Strategy 具體策略: 實(shí)現(xiàn)Strategy接口中的具體算法。
- Context 上下文: 通過一個(gè)*Strategy對(duì)象來對(duì)其進(jìn)行配置闷盔;維護(hù)一個(gè)對(duì)Strategy對(duì)象的引用弯洗;可定義一個(gè)接口來讓Strategy訪問它的數(shù)據(jù)。
策略模式適用情形:
- 如果在一個(gè)系統(tǒng)里面有許多類馁筐,它們之間的區(qū)別僅在于它們的行為涂召,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種敏沉。這些具體算法類均有統(tǒng)一的接口果正,由于多態(tài)性原則,客戶端可以選擇使用任何一個(gè)具體算法類盟迟,并只持有一個(gè)數(shù)據(jù)類型是抽象算法類的對(duì)象秋泳。
- 一個(gè)系統(tǒng)的算法使用的數(shù)據(jù)不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的復(fù)雜的和只與算法有關(guān)的數(shù)據(jù)攒菠。
- 如果一個(gè)對(duì)象有很多的行為迫皱,如果不用恰當(dāng)?shù)哪J剑@些行為就只好使用多重的條件選擇語(yǔ)句來實(shí)現(xiàn)辖众。此時(shí)卓起,使用策略模式,把這些行為轉(zhuǎn)移到相應(yīng)的具體策略類里面凹炸,可以避免使用難以維護(hù)的多重條件選擇語(yǔ)句戏阅。
策略模式優(yōu)點(diǎn):
- 策略模式恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免重復(fù)的代碼啤它。
- 策略模式提供了可以替換繼承關(guān)系的辦法奕筐。繼承可以處理多種算法或行為。如果不是用策略模式变骡,那么使用算法或行為的環(huán)境類就可能會(huì)有一些子類离赫,每一個(gè)子類提供一個(gè)不同的算法或行為。但是塌碌,這樣一來算法或行為的使用者就和算法或行為本身混在一起渊胸。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起,從而不可能再獨(dú)立演化台妆。繼承使得動(dòng)態(tài)改變算法或行為變得不可能蹬刷。
- 使用策略模式可以避免使用多重條件判斷語(yǔ)句瓢捉。
策略模式缺點(diǎn):
- 客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類办成。策略模式只適用于客戶端知道所有的算法或行為的情況泡态。
- 策略模式造成很多的策略類。
其他
源碼地址
其他設(shè)計(jì)模式