一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

C#面向?qū)ο笤O(shè)計(jì)模式縱橫談:Strategy 策略模式

  算法與對象的耦合

  對象可能經(jīng)常需要使用多種不同的算法,但是如果變化頻繁,會(huì)將類型變得脆弱……

image

  動(dòng)機(jī)(Motivation)

  在軟件構(gòu)建過程中,某些對象使用的算法可能多種多樣,經(jīng)常改變,如果將這些算法都編碼到對象中,將會(huì)使對象變得異常復(fù)雜;而且有時(shí)候支持不使用的算法也是一個(gè)性能負(fù)擔(dān)。如何在運(yùn)行時(shí)根據(jù)需要透明地更改對象的算法?將算法與對象本身解耦,從而避免上述問題?

  意圖(Intent)

  定義一系列算法,把它們一個(gè)個(gè)封裝起來,并且使它們可互相替換。該模式使得算法可獨(dú)立于使用它的客戶而變化。

                                          ——《設(shè)計(jì)模式》GoF

  例說Strategy模式應(yīng)用

image

  這個(gè)程序有兩個(gè)可能的變化點(diǎn):當(dāng)枚舉類型增加時(shí),即處理的方法增加,那么Process函數(shù)需要修改補(bǔ)充一個(gè)if else分支;當(dāng)我們想對分支1的處理ProcessA進(jìn)行更改時(shí),也要對Process函數(shù)進(jìn)行修改。針對上面的問題,我們首先想到的是把ProcessA寫成受保護(hù)的虛函數(shù)(在OO中我們一般把虛函數(shù)都寫成受保護(hù)的函數(shù),因?yàn)樗悄芨淖冾惖男袨榈暮瘮?shù),一般情況下只應(yīng)該作為子類和父類之間的協(xié)議出現(xiàn))。

  Strategy模式的設(shè)計(jì)

image

  把Cart類和ProcessStrategy類作為對象組合的方式使用。IProcessStrategy表達(dá)的是一個(gè)算法抽象。

  抽象和具體算法

image

  客戶程序

image

  這樣算法就可以動(dòng)態(tài)地去改變了,我們動(dòng)態(tài)地去new一組具體的Process算法,然后提供給Cart類使用。delegate只要符合參數(shù)和返回值,不管是靜態(tài)方法或者是抽象方法,就可以動(dòng)態(tài)地掛上。但是接口需要抽象含義一致,因此對于這個(gè)模式更推薦使用接口來表達(dá)抽象的算法。

  結(jié)構(gòu)(Structure)

image

  算法并不是孤立的,它通常都需要有一些上下文去調(diào)用它,或者是傳入一些參數(shù)。Strategy類型里面不攜帶狀態(tài)信息(這是與模板方法的區(qū)別,模板方法本身是攜帶狀態(tài)信息的),我們不能把它看成一種實(shí)例,即使有狀態(tài),也是會(huì)通過參數(shù)傳入。一個(gè)Strategy定義了一個(gè)算法的完整步驟和結(jié)構(gòu),只要用一個(gè)Strategy具體類,就可以完成整個(gè)算法的操作,不會(huì)有其它依賴和耦合。Context和Strategy是一個(gè)對象組合的使用關(guān)系。Strategy中的抽象接口隨時(shí)可以替換成具體的類,達(dá)到在不同算法之間動(dòng)態(tài)地切換。

  這個(gè)模式的核心是通過對象組合的方式把本來直接調(diào)用的內(nèi)容委托給接口實(shí)體對象來完成,至于接口實(shí)體對象具體是什么,在運(yùn)行時(shí)才知道,即是運(yùn)行時(shí)改變。

  Strategy模式的幾個(gè)要點(diǎn)

  Strategy及其子類為組件提供了一系列可重用的算法,從而可以使得類型在運(yùn)行時(shí)方便地根據(jù)需要在各個(gè)算法之間進(jìn)行切換,所謂封裝算法,支持算法的變化。Strategy模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的代碼通常都需要Strategy模式。

  與State類似,如果Strategy對象沒有實(shí)例變量,那么各個(gè)上下文可以共享一個(gè)Strategy對象,從而節(jié)省對象開銷。Strategy模式適用的是算法結(jié)構(gòu)中整個(gè)算法的改變,而不是算法中某個(gè)部分的改變。

  Template Method方法:執(zhí)行算法的步驟協(xié)議是本身放在抽象類里面的,允許一個(gè)通用的算法操作多個(gè)可能實(shí)現(xiàn)

  Strategy模式:執(zhí)行算法的協(xié)議是在具體類,每個(gè)具體實(shí)現(xiàn)有不同通用算法來做。

  .NET框架中的Strategy應(yīng)用

image

  例如ArrayList類,Sort方法做不了什么事情,因?yàn)镻oint類不支持排序,沒有繼承IComparer接口。

image

  但如果我們想支持排序,其實(shí)Sort方法就是一個(gè)Strategy模式,它支持傳入一個(gè)繼承IComparer接口的具體類。

image

  IComparer接口其實(shí)就是Strategy我們上面例子中的IProcessStrategy。我們可以實(shí)現(xiàn)一個(gè)IComparer接口,然后把具體類傳入,這樣Sort方法就會(huì)按我們定義的排序規(guī)則執(zhí)行了。

image

  當(dāng)我們需要切換排序方法的時(shí)候,只需要更改傳入Sort的具體比較類即可。

image

  ArrayList雖然沒有把排序方法作為字段組合,但是它把它作為參數(shù)來使用了。因?yàn)楸容^不是在ArrayList中大多數(shù)方法都使用,只有排序才需要使用,所以把它作為參數(shù)使用更合適。

it知識庫C#面向?qū)ο笤O(shè)計(jì)模式縱橫談:Strategy 策略模式,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美日韩中文国产va另类 | 91青青国产在线观看免费 | 一本色道久久综合亚洲精品 | 一区二区三区四 | 日韩中文字幕在线亚洲一区 | 欧美日韩亚洲区久久综合 | 国产女人视频 | 中文字幕二区三区 | 亚洲综合在线视频 | 国产精品久久久久毛片真精品 | 国产在线精品观看 | 亚洲三级天堂 | 中文字幕亚洲日韩无线码 | 日本大臿亚洲香蕉大片 | 成年美女黄网站色大片免费软件看 | 2021精品国产品免费观看 | 午夜激情视频 | 四虎精品影视 | 天天色综合久久 | 在线观看视频一区二区三区 | 色涩色 | 久久久91精品国产一区二区三区 | 亚洲一区二区色 | 久久综合久久鬼色 | 青青热久久国产久精品 | 亚洲日韩中文字幕 | 久久久青草青青亚洲国产免观 | 久久国产精品只做精品 | 国产色视频一区二区三区 | 四虎永久在线精品免费影视 | 日韩中文字幕在线免费观看 | 午夜在线视频观看版 | 久久精品中文字幕 | 久久性妇女精品免费 | 色丫丫| 国产婷婷成人久久av免费高清 | 51精品视频免费国产专区 | 黄污视频网站 | 亚洲系列中文字幕一区二区 | 欧美一级做一级做片性十三 | 91中文字幕在线播放 |