設(shè)計(jì)模式- 策略模式(Strategy Pattern)

定義

策略是為達(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è)策略類办成。策略模式只適用于客戶端知道所有的算法或行為的情況泡态。
  • 策略模式造成很多的策略類。

其他

源碼地址

dotnet-design-patterns

其他設(shè)計(jì)模式

23種設(shè)計(jì)模式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迂卢,一起剝皮案震驚了整個(gè)濱河市某弦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌而克,老刑警劉巖靶壮,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異员萍,居然都是意外死亡腾降,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門碎绎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來螃壤,“玉大人,你說我怎么就攤上這事筋帖〖榍纾” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵日麸,是天一觀的道長(zhǎng)寄啼。 經(jīng)常有香客問我,道長(zhǎng)代箭,這世上最難降的妖魔是什么墩划? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮嗡综,結(jié)果婚禮上乙帮,老公的妹妹穿的比我還像新娘。我一直安慰自己蛤高,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布碑幅。 她就那樣靜靜地躺著戴陡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沟涨。 梳的紋絲不亂的頭發(fā)上恤批,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音裹赴,去河邊找鬼喜庞。 笑死诀浪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的延都。 我是一名探鬼主播雷猪,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晰房!你這毒婦竟也來了求摇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤殊者,失蹤者是張志新(化名)和其女友劉穎与境,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猖吴,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摔刁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了海蔽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片共屈。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖准潭,靈堂內(nèi)的尸體忽然破棺而出趁俊,到底是詐尸還是另有隱情,我是刑警寧澤刑然,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布寺擂,位于F島的核電站,受9級(jí)特大地震影響泼掠,放射性物質(zhì)發(fā)生泄漏怔软。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一择镇、第九天 我趴在偏房一處隱蔽的房頂上張望挡逼。 院中可真熱鬧,春花似錦腻豌、人聲如沸家坎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虱疏。三九已至,卻和暖如春苏携,著一層夾襖步出監(jiān)牢的瞬間做瞪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留装蓬,地道東北人著拭。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牍帚,于是被迫代替她去往敵國(guó)和親儡遮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容