Template Method 模版方法
重構(gòu)關(guān)鍵技法
- 靜態(tài)到動態(tài)
- 早綁定到晚綁定
- 繼承到組合
- 編譯時(shí)依賴到運(yùn)行時(shí)依賴
- 緊耦合到松耦合
“組件協(xié)作”模式
現(xiàn)代軟件專業(yè)分工之后的第一個結(jié)果是“框架與應(yīng)用程序的劃分”,“組件協(xié)作”模式通過晚綁定分蓖,來實(shí)現(xiàn)框架與應(yīng)用程序之間的松耦合典挑,是二者之間協(xié)作時(shí)常用的模式动知。
- 典型模式
Template Method
Strategy
Observer/Event
Template Method
動機(jī)
在軟件構(gòu)建過程中,對于某一項(xiàng)任務(wù)竿刁,它常常有穩(wěn)定的整體操作結(jié)構(gòu)定躏,但各個子步驟卻有很多改變的需求合武,或者由于固有的原因(比如框架與應(yīng)用之間的關(guān)系)而無法和任務(wù)的整體結(jié)構(gòu)同時(shí)實(shí)現(xiàn)跃脊。
例子1:銀行業(yè)務(wù)辦理流程在銀行辦理業(yè)務(wù)時(shí)淮野,一般都包含幾個基本固定步驟:取號排隊(duì)->辦理具體業(yè)務(wù)->對銀行工作人員進(jìn)行評分捧书。取號取號排隊(duì)和對銀行工作人員進(jìn)行評分業(yè)務(wù)邏輯是一樣的吹泡。但是辦理具體業(yè)務(wù)是個不相同的,具體業(yè)務(wù)可能取款经瓷、存款或者轉(zhuǎn)賬爆哑。
如何在確定穩(wěn)定操作結(jié)構(gòu)的前提下,來靈活應(yīng)對各個子步驟的變化或者晚期實(shí)現(xiàn)需求了嚎?
軟件設(shè)計(jì)流程
-
結(jié)構(gòu)化
- 面向?qū)ο?/li>
早綁定與晚綁定
模式定義
定義一個操作中的算法的骨架(穩(wěn)定)泪漂,而將一些步驟(變化)延遲到子類中。 T模板方法使得子類可以不改變(復(fù)用)一個算法的結(jié)構(gòu)即可重定義(override重寫)該算法的某些特定步驟歪泳。
解決方法:
- 1)模板方法模式是基于繼承的代碼復(fù)用基本技術(shù)萝勤,模板方法模式的結(jié)構(gòu)和用法也是面向?qū)ο笤O(shè)計(jì)的核心之一。在模板方法模式中呐伞,可以將相同的代碼放在父類中敌卓,而將不同的方法實(shí)現(xiàn)放在不同的子類中。
- 2)在模板方法模式中伶氢,我們需要準(zhǔn)備一個抽象類趟径,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后聲明一些抽象方法來讓子類實(shí)現(xiàn)剩余的邏輯癣防。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法蜗巧,從而對剩余的邏輯有不同的實(shí)現(xiàn),這就是模板方法模式的用意蕾盯。模板方法模式體現(xiàn)了面向?qū)ο蟮闹T多重要思想幕屹,是一種使用頻率較高的模式。
結(jié)構(gòu)
要點(diǎn)總結(jié)
- T模式是一種非臣对猓基礎(chǔ)性的設(shè)計(jì)模式望拖,在面向?qū)ο笙到y(tǒng)中有著大量的應(yīng)用。它用最簡潔的機(jī)制(虛函數(shù)的多態(tài)性)為很多應(yīng)用程序框架提供了靈活的擴(kuò)展點(diǎn)挫鸽,是代碼復(fù)用方面的基本實(shí)現(xiàn)結(jié)構(gòu)说敏。
- 除了可以靈活應(yīng)對子步驟的變化外,“不要調(diào)用我丢郊,讓我來調(diào)用你”的反向控制結(jié)構(gòu)是T模式的典型應(yīng)用盔沫。
- 在具體實(shí)現(xiàn)方面,被T模式調(diào)用的虛方法可以具有實(shí)現(xiàn)枫匾,也可以沒有任何實(shí)現(xiàn)(抽象方法迅诬、純虛方法),但一般推薦將它們設(shè)置prtected方法
策略模式(選擇上的變化)
動機(jī)
- 在軟件開發(fā)中也常常遇到類似的情況婿牍,實(shí)現(xiàn)某一個功能有多種算法或者策略,如果將這些算法都編碼到對象中惩歉,將會使對象變得異常復(fù)雜等脂;而且有些時(shí)候支持不使用的算法也是一個性能負(fù)擔(dān)
- 如何在運(yùn)行時(shí)根據(jù)需要需要透明地更改對象的算法俏蛮?將算法與對象本身解耦,從而避免上述問題上遥?
模式定義(枚舉類型搏屑,switch等)
定義一系列的算法,把每一個算法封裝起來, 并且使它們可相互替換(變化)。本模式使得算法可獨(dú)立于使用它的客戶程序(穩(wěn)定)而變化(擴(kuò)展粉楚,子類化)辣恋。
適用性
當(dāng)存在以下情況時(shí)使用Strategy模式
- 許多相關(guān)的類僅僅是行為有異。 “策略”提供了一種用多個行為中的一個行為來配置一個類的方法模软。即一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種伟骨。
- 需要使用一個算法的不同變體。例如燃异,你可能會定義一些反映不同的空間 /時(shí)間權(quán)衡的算法携狭。當(dāng)這些變體實(shí)現(xiàn)為一個算法的類層次時(shí) ,可以使用策略模式。
- 算法使用客戶不應(yīng)該知道的數(shù)據(jù)回俐」渫龋可使用策略模式以避免暴露復(fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)仅颇。
- 一個類定義了多種行為 , 并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn)单默。將相關(guān)的條件分支移入它們各自的Strategy類中以代替這些條件語句。
結(jié)構(gòu)
模式的組成
- 環(huán)境類(Context):用一個ConcreteStrategy對象來配置忘瓦。維護(hù)一個對Strategy對象的引用搁廓。可定義一個接口來讓Strategy訪問它的數(shù)據(jù)政冻。
- 抽象策略類(Strategy):定義所有支持的算法的公共接口枚抵。 Context使用這個接口來調(diào)用某ConcreteStrategy定義的算法。
- 具體策略類(ConcreteStrategy):以Strategy接口實(shí)現(xiàn)某具體算法
要點(diǎn)總結(jié)
- Strategy及其子類為組件提供了一系列可重用的算法明场,從而可以使得類型在運(yùn)行時(shí)方便地根據(jù)需要在各個算法之間進(jìn)行切換汽摹。
- Strategy模式提供了用條件判斷語句以外 的另一種選擇,消除條件判斷語句,就是在解耦合苦锨。含有許多條件判斷語句的代碼通常都需要Strategy模式逼泣。
- 如果Strategy對象沒有實(shí)例變量,那么各個上下文可以共享同一個Strategy對象舟舒,從而節(jié)省對象開銷拉庶。
5.觀察者模式
textwatch 如何實(shí)現(xiàn)
不會耦合具體的觀察者
觀察者自己來決定是否需要訂閱通知,目標(biāo)對象對此一無所知