設(shè)計(jì)模式復(fù)習(xí)(2)_第1頁(yè)
設(shè)計(jì)模式復(fù)習(xí)(2)_第2頁(yè)
設(shè)計(jì)模式復(fù)習(xí)(2)_第3頁(yè)
設(shè)計(jì)模式復(fù)習(xí)(2)_第4頁(yè)
設(shè)計(jì)模式復(fù)習(xí)(2)_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、常常 文文 萃萃1.1.狀態(tài)模狀態(tài)模式式 模模式動(dòng)機(jī):式動(dòng)機(jī):為了解決系統(tǒng)中復(fù)雜對(duì)象的狀態(tài)轉(zhuǎn)換以及不為了解決系統(tǒng)中復(fù)雜對(duì)象的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下行為的封裝問(wèn)題。同狀態(tài)下行為的封裝問(wèn)題。 模模式定義式定義 :允允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了它的類行為,對(duì)象看起來(lái)似乎修改了它的類。 模式結(jié)模式結(jié)構(gòu)構(gòu)stateContext- state : State+request ()setState (State state).State+ handle ().ConcreteStateA+ handle ().ConcreteStat

2、eB+ handle ().state.handle();. 模式解析:模式解析:狀態(tài)模式的關(guān)鍵是引入了一個(gè)抽象狀態(tài)類來(lái)專門表示對(duì)象的狀態(tài),而對(duì)象的每一種具體狀態(tài)類都繼承了該類,并在不同具體狀態(tài)類中實(shí)現(xiàn)了不同狀態(tài)的行為,包括各種狀態(tài)之間的轉(zhuǎn)換。角色:角色:Context: 環(huán)境類環(huán)境類State: 抽象狀態(tài)類抽象狀態(tài)類ConcreteState: 具體狀態(tài)類具體狀態(tài)類l模式優(yōu)缺模式優(yōu)缺點(diǎn)點(diǎn) 優(yōu)點(diǎn) 封裝了轉(zhuǎn)換規(guī)則。 將所有與某個(gè)狀態(tài)有關(guān)的行為放到一個(gè)類中,并且可以方便地增加新的狀態(tài),只需要改變對(duì)象狀態(tài)即可改變對(duì)象的行為。 允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對(duì)象合成一體,而不是某一個(gè)巨大的條件語(yǔ)句塊。 缺點(diǎn)

3、狀態(tài)模式的使用必然會(huì)增加系統(tǒng)類和對(duì)象的個(gè)數(shù)。 狀態(tài)模式的結(jié)構(gòu)與實(shí)現(xiàn)都較為復(fù)雜,如果使用不當(dāng)將導(dǎo)致程序結(jié)構(gòu)和代碼的混亂。 狀態(tài)模式對(duì)“開閉原則”的支持并不太好,對(duì)于可以切換狀態(tài)的狀態(tài)模式,增加新的狀態(tài)類需要修改那些負(fù)責(zé)狀態(tài)轉(zhuǎn)換的源代碼,否則無(wú)法切換到新增狀態(tài);而且修改某個(gè)狀態(tài)類的行為也需修改對(duì)應(yīng)類的源代碼。l 模模式應(yīng)式應(yīng)用:用:狀狀態(tài)模式在工作流或游戲等類型的軟件中得以廣泛使用,甚態(tài)模式在工作流或游戲等類型的軟件中得以廣泛使用,甚至可以用于這些系統(tǒng)的核心功能設(shè)計(jì),如在政府至可以用于這些系統(tǒng)的核心功能設(shè)計(jì),如在政府OA辦公系統(tǒng)辦公系統(tǒng)中,一個(gè)批文的狀態(tài)有多種:尚未辦理;正在辦理;正在批中,一個(gè)批

4、文的狀態(tài)有多種:尚未辦理;正在辦理;正在批示;正在審核;已經(jīng)完成等各種狀態(tài),而且批文狀態(tài)不同時(shí)示;正在審核;已經(jīng)完成等各種狀態(tài),而且批文狀態(tài)不同時(shí)對(duì)批文的操作也有所差異。使用狀態(tài)模式可以描述工作流對(duì)對(duì)批文的操作也有所差異。使用狀態(tài)模式可以描述工作流對(duì)象(如批文)的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下它所具有的行為。象(如批文)的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下它所具有的行為。 在在目前主流的角色扮演游戲)中,使用狀態(tài)模式可以對(duì)游戲目前主流的角色扮演游戲)中,使用狀態(tài)模式可以對(duì)游戲角色進(jìn)行控制,游戲角色的升級(jí)伴隨著其狀態(tài)的變化和行為角色進(jìn)行控制,游戲角色的升級(jí)伴隨著其狀態(tài)的變化和行為的變化。對(duì)于游戲程序本身也可以通過(guò)狀

5、態(tài)模式進(jìn)行總控,的變化。對(duì)于游戲程序本身也可以通過(guò)狀態(tài)模式進(jìn)行總控,一個(gè)游戲活動(dòng)包括開始、運(yùn)行、結(jié)束等狀態(tài),通過(guò)對(duì)狀態(tài)的一個(gè)游戲活動(dòng)包括開始、運(yùn)行、結(jié)束等狀態(tài),通過(guò)對(duì)狀態(tài)的控制可以控制系統(tǒng)的行為,決定游戲的各個(gè)方面,因此可以控制可以控制系統(tǒng)的行為,決定游戲的各個(gè)方面,因此可以使用狀態(tài)模式對(duì)整個(gè)游戲的架構(gòu)進(jìn)行設(shè)計(jì)與實(shí)現(xiàn)。使用狀態(tài)模式對(duì)整個(gè)游戲的架構(gòu)進(jìn)行設(shè)計(jì)與實(shí)現(xiàn)。2.2.模板方法模式模板方法模式 模式動(dòng)模式動(dòng)機(jī):機(jī):去飯店吃飯,無(wú)論吃什么,都包含點(diǎn)菜、吃飯、去飯店吃飯,無(wú)論吃什么,都包含點(diǎn)菜、吃飯、買單三個(gè)步驟。而吃什么卻因人而異。在軟件開發(fā)時(shí)會(huì)遇買單三個(gè)步驟。而吃什么卻因人而異。在軟件開發(fā)時(shí)會(huì)

6、遇到同樣的問(wèn)題。模板方法解決這類問(wèn)題。到同樣的問(wèn)題。模板方法解決這類問(wèn)題。 模式定義模式定義 定義一個(gè)操作中算法的框架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。模板方法是一種類行為型模式。 模式結(jié)模式結(jié)構(gòu)構(gòu)AbstractClassabstract +templateMethod ()primitiveOperation1 ()primitiveOperation2 ()primitiveOperation3 ().ConcreteClass+primitiveOperation1 ()primitiveOperation2 ().角色

7、:角色:AbstractClassAbstractClass: : 抽象類抽象類 ConcreteClassConcreteClass: : 具體子類具體子類 模式解模式解析析 一個(gè)模板方法是定義在抽象類中的、把基本操作方法組合在一起形成一個(gè)總算法或一個(gè)總行為的方法。模式優(yōu)缺模式優(yōu)缺點(diǎn)點(diǎn) 優(yōu)點(diǎn)模板方法模式在一個(gè)類中形式化地定義算法,而由它的子類實(shí)現(xiàn)細(xì)節(jié)的處理。模板方法模式是一種代碼復(fù)用的基本技術(shù)。模板方法模式導(dǎo)致一種反向的控制結(jié)構(gòu),通過(guò)一個(gè)父類調(diào)用其子類的操作,通過(guò)對(duì)子類的擴(kuò)展增加新的行為,符合“開閉原則”。 缺點(diǎn)每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會(huì)導(dǎo)致類的個(gè)數(shù)增加,系統(tǒng)更加龐大,設(shè)計(jì)也更加

8、抽象,但是更加符合“單一職責(zé)原則”,使得類的內(nèi)聚性得以提高。模式應(yīng)用模式應(yīng)用 模板方法模式廣泛應(yīng)用于框架設(shè)計(jì)中,以確保父類控制處理流程的邏輯順序(如框架的初始化)。3.3.訪問(wèn)者模式訪問(wèn)者模式模模式動(dòng)式動(dòng)機(jī)機(jī) 對(duì)于系統(tǒng)中的某些對(duì)象,它們存儲(chǔ)在同一個(gè)集合中,且具有不同的類型,而且對(duì)于該集合中的對(duì)象,可以接受一類稱為訪問(wèn)者的對(duì)象來(lái)訪問(wèn),而且不同的訪問(wèn)者其訪問(wèn)方式有所不同,訪問(wèn)者模式為解決這類問(wèn)題而誕生。模式定義模式定義 表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。訪問(wèn)者模式是一種對(duì)象行為型模式。模模式結(jié)式結(jié)構(gòu)構(gòu)接口接口接口接口角色:角

9、色:Vistor: 抽象訪問(wèn)者抽象訪問(wèn)者ConcreteVisitor: 具體訪問(wèn)者具體訪問(wèn)者Element: 抽象元素抽象元素ConcreteElement: 具體元素具體元素 ObjectStructure: 對(duì)象結(jié)構(gòu)對(duì)象結(jié)構(gòu)模模式解式解析析訪問(wèn)者模式中對(duì)象結(jié)構(gòu)存儲(chǔ)了不同類型的元素對(duì)象,以供不訪問(wèn)者模式中對(duì)象結(jié)構(gòu)存儲(chǔ)了不同類型的元素對(duì)象,以供不同訪問(wèn)者訪問(wèn)。同訪問(wèn)者訪問(wèn)。訪問(wèn)者模式包括兩個(gè)層次結(jié)構(gòu),一個(gè)是訪問(wèn)者層次結(jié)構(gòu),提訪問(wèn)者模式包括兩個(gè)層次結(jié)構(gòu),一個(gè)是訪問(wèn)者層次結(jié)構(gòu),提供了抽象訪問(wèn)者和具體訪問(wèn)者,一個(gè)是元素層次結(jié)構(gòu),提供供了抽象訪問(wèn)者和具體訪問(wèn)者,一個(gè)是元素層次結(jié)構(gòu),提供了抽象元素和具

10、體元素。了抽象元素和具體元素。相同的訪問(wèn)者可以以不同的方式訪問(wèn)不同的元素,相同的元相同的訪問(wèn)者可以以不同的方式訪問(wèn)不同的元素,相同的元素可以接受不同訪問(wèn)者以不同訪問(wèn)方式訪問(wèn)。在訪問(wèn)者模式素可以接受不同訪問(wèn)者以不同訪問(wèn)方式訪問(wèn)。在訪問(wèn)者模式中,增加新的訪問(wèn)者無(wú)須修改原有系統(tǒng),系統(tǒng)具有較好的中,增加新的訪問(wèn)者無(wú)須修改原有系統(tǒng),系統(tǒng)具有較好的可可擴(kuò)展擴(kuò)展性性。模模式優(yōu)缺式優(yōu)缺點(diǎn)點(diǎn) 優(yōu)點(diǎn)使得增加新的訪問(wèn)操作變得很容易。將有關(guān)元素對(duì)象的訪問(wèn)行為集中到一個(gè)訪問(wèn)者對(duì)象中,而不是分散到一個(gè)個(gè)的元素類中。 可以跨過(guò)類的等級(jí)結(jié)構(gòu)訪問(wèn)屬于不同的等級(jí)結(jié)構(gòu)的元素類。讓用戶能夠在不修改現(xiàn)有類層次結(jié)構(gòu)的情況下,定義該類層次

11、結(jié)構(gòu)的操作。 缺點(diǎn)增加新的元素類很困難。在訪問(wèn)者模式中,每增加一個(gè)新的元素類都意味著要在抽象訪問(wèn)者角色中增加一個(gè)新的抽象操作,并在每一個(gè)具體訪問(wèn)者類中增加相應(yīng)的具體操作,違背了“開閉原則”的要求。破壞封裝。訪問(wèn)者模式要求訪問(wèn)者對(duì)象訪問(wèn)并調(diào)用每一個(gè)元素對(duì)象的操作,這意味著元素對(duì)象有時(shí)候必須暴露一些自己的內(nèi)部操作和內(nèi)部狀態(tài),否則無(wú)法供訪問(wèn)者訪問(wèn)。模模式應(yīng)式應(yīng)用用 一些編譯器的設(shè)計(jì)中運(yùn)用了訪問(wèn)者模式,程序代碼是被訪問(wèn)的對(duì)象,它包括變量定義、變量賦值、邏輯運(yùn)算、算術(shù)運(yùn)算等語(yǔ)句,編譯器需要對(duì)代碼進(jìn)行分析,如檢查變量是否定義、變量是否賦值、算術(shù)運(yùn)算是否合法等,可以將不同的操作封裝在不同的類中,如檢查變量定

12、義的類、檢查變量賦值的類、檢查算術(shù)運(yùn)算是否合法的類,這些類就是具體訪問(wèn)者,可以訪問(wèn)程序代碼中不同類型的語(yǔ)句。在編譯過(guò)程中除了代碼分析外,還包含代碼優(yōu)化、空間分配和代碼生成等部分,也可以將每一個(gè)不同編譯階段的操作封裝到了跟該階段有關(guān)的一個(gè)訪問(wèn)者類中。4.4.策略模式策略模式模模式動(dòng)式動(dòng)機(jī):機(jī):完成一項(xiàng)任務(wù),往往可以有多種不同的方式,每一種方式稱為一個(gè)策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的策略來(lái)完成該項(xiàng)任務(wù)。模式定模式定義義 定義一系列算法,將每一個(gè)算法封裝起來(lái),并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化。策略模式是一種對(duì)象行為型模式。模模式結(jié)式結(jié)構(gòu)構(gòu)strategyCo

13、ntext- strategy : Strategy+ algorithm ().Strategyabstract + algorithm ().ConcreteStrategyA+ algorithm ().ConcreteStrategyB+ algorithm ().strategy.algorithm();.角色角色:Context: 環(huán)境類Strategy: 抽象策略類ConcreteStrategy: 具體策略類模式解析模式解析 策略模式是對(duì)算法的封裝,它把算法的責(zé)任和算法本身分割開,委派給不同的對(duì)象管理。策略模式通常把一個(gè)系列的算法封裝到一系列的策略類里面,作為一個(gè)抽象策略類的子

14、類。用一句話來(lái)說(shuō),就是“準(zhǔn)備一組算法,并將每一個(gè)算法封裝起來(lái),使得它們可以互換”。 在策略模式中,由客戶端自己決定在什么情況下使用什么具體策略角色。模式優(yōu)缺點(diǎn)模式優(yōu)缺點(diǎn) 優(yōu)點(diǎn)策略模式提供了對(duì)“開閉原則”的完美支持,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為,也可以靈活地增加新的算法或行為。策略模式提供了管理相關(guān)的算法族的辦法。策略模式提供了可以替換繼承關(guān)系的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。 缺點(diǎn)客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。 策略模式將造成產(chǎn)生很多策略類,可以通過(guò)使用享元模式在一定程度上減少對(duì)象的數(shù)量。模式應(yīng)用模式應(yīng)用(1) Java SE的容器布

15、局管理就是策略模式應(yīng)用的一個(gè)經(jīng)典實(shí)例。 (2)在微軟公司提供的演示項(xiàng)目PetShop 4.0中使用策略模式來(lái)處理同步訂單和異步訂單的問(wèn)題。5.5.觀察者模式觀察者模式模模式動(dòng)式動(dòng)機(jī):機(jī):建立一種對(duì)象與對(duì)象之間建立一種對(duì)象與對(duì)象之間的的依的的依賴關(guān)系,一個(gè)對(duì)賴關(guān)系,一個(gè)對(duì)象發(fā)生改變時(shí)將自動(dòng)通知其他對(duì)象,其他對(duì)象將相應(yīng)做出反應(yīng)。象發(fā)生改變時(shí)將自動(dòng)通知其他對(duì)象,其他對(duì)象將相應(yīng)做出反應(yīng)。在此,發(fā)生改變的對(duì)象稱為觀察目標(biāo),而被通知的對(duì)象稱為觀在此,發(fā)生改變的對(duì)象稱為觀察目標(biāo),而被通知的對(duì)象稱為觀察者,一個(gè)觀察目標(biāo)可以對(duì)應(yīng)多個(gè)觀察者,而且這些觀察者之察者,一個(gè)觀察目標(biāo)可以對(duì)應(yīng)多個(gè)觀察者,而且這些觀察者之間

16、沒(méi)有相互聯(lián)系,可以根據(jù)需要增加和刪除觀察者,使得系統(tǒng)間沒(méi)有相互聯(lián)系,可以根據(jù)需要增加和刪除觀察者,使得系統(tǒng)更易于擴(kuò)展,這就是觀察者模式的模式動(dòng)機(jī)。更易于擴(kuò)展,這就是觀察者模式的模式動(dòng)機(jī)。模式定模式定義:義:定義對(duì)象間的一種一對(duì)多依賴關(guān)系,使得每當(dāng)一定義對(duì)象間的一種一對(duì)多依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對(duì)象皆得到通知并被自動(dòng)個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對(duì)象皆得到通知并被自動(dòng)更新。更新。模模式結(jié)式結(jié)構(gòu)構(gòu)角色:Subject: 目標(biāo)ConcreteSubject: 具體目標(biāo)Observer: 觀察者ConcreteObserver: 具體觀察者模模式解式解析析觀察者模式描述了

17、如何建立對(duì)象與對(duì)象之間的依賴關(guān)系,如何構(gòu)造滿足這種需求的系統(tǒng)。這一模式中的關(guān)鍵對(duì)象是觀察目標(biāo)和觀察者,一個(gè)目標(biāo)可以有任意數(shù)目的與之相依賴的觀察者,一旦目標(biāo)的狀態(tài)發(fā)生改變,所有的觀察者都將得到通知。作為對(duì)這個(gè)通知的響應(yīng),每個(gè)觀察者都將即時(shí)更新自己的狀態(tài),以與目標(biāo)狀態(tài)同步,這種交互也稱為發(fā)布-訂閱(publish-subscribe)。目標(biāo)是通知的發(fā)布者,它發(fā)出通知時(shí)并不需要知道誰(shuí)是它的觀察者,可以有任意數(shù)目的觀察者訂閱它并接收通知。模模式優(yōu)缺點(diǎn)式優(yōu)缺點(diǎn) 優(yōu)點(diǎn)觀察者模式可以實(shí)現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,并定義了穩(wěn)定的消息更新傳遞機(jī)制,抽象了更新接口,使得可以有各種各樣不同的表示層作為具體觀察者角色

18、。觀察者模式在觀察目標(biāo)和觀察者之間建立一個(gè)抽象的耦合。 觀察者模式支持廣播通信。觀察者模式符合“開閉原則”的要求。 缺點(diǎn)如果一個(gè)觀察目標(biāo)對(duì)象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對(duì)象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。模式應(yīng)用模式應(yīng)用(1) JDK1.1版本及以后的各個(gè)版本中,事件處理模型采用基于觀察者模式的委派事件模型(Delegation Event Model, DEM)。 在DEM中,事件的發(fā)布者稱

19、為事件源(Event Source),而訂閱者叫做事件監(jiān)聽器(Event Listener),在這個(gè)過(guò)程中還可以通過(guò)事件對(duì)象(Event Object)來(lái)傳遞與事件相關(guān)的信息,可以在事件監(jiān)聽者的實(shí)現(xiàn)類中實(shí)現(xiàn)事件處理。事件源對(duì)象、事件監(jiān)聽對(duì)象(事件處理對(duì)象)和事件對(duì)象構(gòu)成了Java事件處理模型的三要素。(2) 除了AWT中的事件處理之外,Java語(yǔ)言解析XML的技術(shù)SAX2以及Servlet技術(shù)的事件處理機(jī)制都基于DEM,都是觀察者模式的應(yīng)用。(3) 觀察者模式在軟件開發(fā)中應(yīng)用非常廣泛,如某電子商務(wù)網(wǎng)站可以在執(zhí)行發(fā)送操作后給用戶多個(gè)發(fā)送商品打折信息,某團(tuán)隊(duì)?wèi)?zhàn)斗游戲中某隊(duì)友犧牲將給所有成員提示等等

20、,凡是涉及到一對(duì)一或者一對(duì)多的對(duì)象交互場(chǎng)景都可以使用觀察者模式。 1.1.代代理模式理模式模式動(dòng)模式動(dòng)機(jī):機(jī):在某些情況下,一個(gè)客戶不想或者不能直接引用在某些情況下,一個(gè)客戶不想或者不能直接引用一個(gè)對(duì)象,此時(shí)可以通過(guò)一個(gè)稱之為一個(gè)對(duì)象,此時(shí)可以通過(guò)一個(gè)稱之為“代理代理”的第三者來(lái)實(shí)的第三者來(lái)實(shí)現(xiàn)間接引用。代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中現(xiàn)間接引用。代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用,并且可以通過(guò)代理對(duì)象去掉客戶不能看到的內(nèi)容介的作用,并且可以通過(guò)代理對(duì)象去掉客戶不能看到的內(nèi)容和服務(wù)或者添加客戶需要的額外服務(wù)和服務(wù)或者添加客戶需要的額外服務(wù)。 通通過(guò)引入一個(gè)新的對(duì)象(如小圖

21、片和遠(yuǎn)程代理對(duì)象)來(lái)過(guò)引入一個(gè)新的對(duì)象(如小圖片和遠(yuǎn)程代理對(duì)象)來(lái)實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的操作或者將新的對(duì)象作為真實(shí)對(duì)象的一個(gè)實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的操作或者將新的對(duì)象作為真實(shí)對(duì)象的一個(gè)替身,這種實(shí)現(xiàn)機(jī)制即為代理模式,通過(guò)引入代理對(duì)象來(lái)間替身,這種實(shí)現(xiàn)機(jī)制即為代理模式,通過(guò)引入代理對(duì)象來(lái)間接訪問(wèn)一個(gè)對(duì)象,這就是代理模式的模式動(dòng)機(jī)。接訪問(wèn)一個(gè)對(duì)象,這就是代理模式的模式動(dòng)機(jī)。 preRequest();realSubject.request();postRequest();realSubjectSubject+ request ().Proxy- realSubject : RealSubject+preRequ

22、est ()request ()postRequest ().RealSubject+ request ().Client模模式定式定義:義:給某一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制給某一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制對(duì)原對(duì)象的引用對(duì)原對(duì)象的引用。它。它是一種對(duì)象結(jié)構(gòu)型模式。是一種對(duì)象結(jié)構(gòu)型模式。模式結(jié)構(gòu)模式結(jié)構(gòu)角色:Subject: 抽象主題角色Proxy: 代理主題角色RealSubject: 真實(shí)主題角色模模式解析式解析接口代理類實(shí)現(xiàn)類實(shí)現(xiàn)實(shí)現(xiàn)調(diào)用模模式優(yōu)缺式優(yōu)缺點(diǎn)點(diǎn) 優(yōu)點(diǎn)優(yōu)點(diǎn) 代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系

23、統(tǒng)的耦合度。低了系統(tǒng)的耦合度。 遠(yuǎn)程代理使得客戶端可以訪問(wèn)在遠(yuǎn)程機(jī)器上的對(duì)象,遠(yuǎn)遠(yuǎn)程代理使得客戶端可以訪問(wèn)在遠(yuǎn)程機(jī)器上的對(duì)象,遠(yuǎn)程機(jī)器可能具有更好的計(jì)算性能與處理速度,可以快速程機(jī)器可能具有更好的計(jì)算性能與處理速度,可以快速響應(yīng)并處理客戶端請(qǐng)求。響應(yīng)并處理客戶端請(qǐng)求。 虛擬代理通過(guò)使用一個(gè)小對(duì)象來(lái)代表一個(gè)大對(duì)象,可以虛擬代理通過(guò)使用一個(gè)小對(duì)象來(lái)代表一個(gè)大對(duì)象,可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。 保護(hù)代理可以控制對(duì)真實(shí)對(duì)象的使用權(quán)限。保護(hù)代理可以控制對(duì)真實(shí)對(duì)象的使用權(quán)限。 缺缺點(diǎn)點(diǎn) 由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因

24、此有由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因此有些類型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢。些類型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢。 實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜。常復(fù)雜。模模式應(yīng)用式應(yīng)用EJBEJB、Web ServiceWeb Service等分布式技術(shù)都是代理模式的應(yīng)用。在等分布式技術(shù)都是代理模式的應(yīng)用。在EJBEJB中中使用了使用了RMIRMI機(jī)制,遠(yuǎn)程服務(wù)器中的企業(yè)級(jí)機(jī)制,遠(yuǎn)程服務(wù)器中的企業(yè)級(jí)BeanBean在本地有一個(gè)樁代在本地有一個(gè)樁代理,客戶端通過(guò)樁來(lái)調(diào)用遠(yuǎn)程對(duì)象中定義的方法,而無(wú)須直接與理,

25、客戶端通過(guò)樁來(lái)調(diào)用遠(yuǎn)程對(duì)象中定義的方法,而無(wú)須直接與遠(yuǎn)程對(duì)象交互。在遠(yuǎn)程對(duì)象交互。在EJBEJB的使用中需要提供一個(gè)公共的接口,客戶的使用中需要提供一個(gè)公共的接口,客戶端針對(duì)該接口進(jìn)行編程,無(wú)須知道樁以及遠(yuǎn)程端針對(duì)該接口進(jìn)行編程,無(wú)須知道樁以及遠(yuǎn)程EJBEJB的實(shí)現(xiàn)細(xì)節(jié)。的實(shí)現(xiàn)細(xì)節(jié)。 Spring Spring 框架中的框架中的AOPAOP技術(shù)也是代理模式的應(yīng)用,在技術(shù)也是代理模式的應(yīng)用,在Spring AOPSpring AOP中應(yīng)用了動(dòng)態(tài)代理中應(yīng)用了動(dòng)態(tài)代理(Dynamic Proxy)(Dynamic Proxy)技術(shù)。技術(shù)。 2.2.裝飾模式裝飾模式模式動(dòng)模式動(dòng)機(jī):機(jī):裝飾模式以對(duì)客戶

26、透明的方式動(dòng)態(tài)地給一個(gè)對(duì)象附裝飾模式以對(duì)客戶透明的方式動(dòng)態(tài)地給一個(gè)對(duì)象附加上更多的責(zé)任,換言之,客戶端并不會(huì)覺得對(duì)象在裝飾前和裝加上更多的責(zé)任,換言之,客戶端并不會(huì)覺得對(duì)象在裝飾前和裝飾后有什么不同。裝飾模式可以在不需要?jiǎng)?chuàng)造更多子類的情況下,飾后有什么不同。裝飾模式可以在不需要?jiǎng)?chuàng)造更多子類的情況下,將對(duì)象的功能加以擴(kuò)展。這就是裝飾模式的模式動(dòng)機(jī)將對(duì)象的功能加以擴(kuò)展。這就是裝飾模式的模式動(dòng)機(jī)。componentComponent+ operation ().ConcreteComponent+ operation ().Decorator+ operation ().component.oper

27、ation();ConcreteDecoratorA- addedState : + operation ().ConcreteDecoratorB+operation ()addedBehavior ().super.operation();addedBehavior();模模式定式定義:義:動(dòng)態(tài)地給一個(gè)對(duì)象增加一些額外的職動(dòng)態(tài)地給一個(gè)對(duì)象增加一些額外的職責(zé),責(zé),就增加對(duì)象就增加對(duì)象功能來(lái)說(shuō),裝飾模式比生成子類實(shí)現(xiàn)更為靈活功能來(lái)說(shuō),裝飾模式比生成子類實(shí)現(xiàn)更為靈活。裝。裝飾模飾模式是式是一種對(duì)一種對(duì)象結(jié)構(gòu)型模式。象結(jié)構(gòu)型模式。模式結(jié)構(gòu)模式結(jié)構(gòu)角色:Component: 抽象構(gòu)件Concrete

28、Component: 具體構(gòu)件Decorator: 抽象裝飾類ConcreteDecorator: 具體裝飾類模模式解式解析析 與繼承關(guān)系相比,關(guān)聯(lián)關(guān)系的主要優(yōu)勢(shì)在于不會(huì)破壞類的封與繼承關(guān)系相比,關(guān)聯(lián)關(guān)系的主要優(yōu)勢(shì)在于不會(huì)破壞類的封裝性,而且繼承是一種耦合度較大的靜態(tài)關(guān)系,無(wú)法在程序裝性,而且繼承是一種耦合度較大的靜態(tài)關(guān)系,無(wú)法在程序運(yùn)行時(shí)動(dòng)態(tài)擴(kuò)展。在軟件開發(fā)階段,關(guān)聯(lián)關(guān)系雖然不會(huì)比繼運(yùn)行時(shí)動(dòng)態(tài)擴(kuò)展。在軟件開發(fā)階段,關(guān)聯(lián)關(guān)系雖然不會(huì)比繼承關(guān)系減少編碼量,但是到了軟件維護(hù)階段,由于關(guān)聯(lián)關(guān)系承關(guān)系減少編碼量,但是到了軟件維護(hù)階段,由于關(guān)聯(lián)關(guān)系使系統(tǒng)具有較好的松耦合性,因此使得系統(tǒng)更加容易維護(hù)。使系

29、統(tǒng)具有較好的松耦合性,因此使得系統(tǒng)更加容易維護(hù)。當(dāng)然,關(guān)聯(lián)關(guān)系的缺點(diǎn)是比繼承關(guān)系要?jiǎng)?chuàng)建更多的對(duì)象。當(dāng)然,關(guān)聯(lián)關(guān)系的缺點(diǎn)是比繼承關(guān)系要?jiǎng)?chuàng)建更多的對(duì)象。 使用裝飾模式來(lái)實(shí)現(xiàn)擴(kuò)展比繼承更加靈活,它以對(duì)客戶透明使用裝飾模式來(lái)實(shí)現(xiàn)擴(kuò)展比繼承更加靈活,它以對(duì)客戶透明的方式動(dòng)態(tài)地給一個(gè)對(duì)象附加更多的責(zé)任。裝飾模式可以在的方式動(dòng)態(tài)地給一個(gè)對(duì)象附加更多的責(zé)任。裝飾模式可以在不需要?jiǎng)?chuàng)造更多子類的情況下,將對(duì)象的功能加以擴(kuò)展。不需要?jiǎng)?chuàng)造更多子類的情況下,將對(duì)象的功能加以擴(kuò)展。 模模式優(yōu)缺式優(yōu)缺點(diǎn)點(diǎn) 優(yōu)點(diǎn)優(yōu)點(diǎn) 裝飾模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但是裝飾模式可裝飾模式與繼承關(guān)系的目的都是要擴(kuò)展對(duì)象的功能,但

30、是裝飾模式可以提供比繼承更多的靈活性。以提供比繼承更多的靈活性。 可以通過(guò)一種動(dòng)態(tài)的方式來(lái)擴(kuò)展一個(gè)對(duì)象的功能,通過(guò)配置文件可以可以通過(guò)一種動(dòng)態(tài)的方式來(lái)擴(kuò)展一個(gè)對(duì)象的功能,通過(guò)配置文件可以在運(yùn)行時(shí)選擇不同的裝飾器,從而實(shí)現(xiàn)不同的行為。在運(yùn)行時(shí)選擇不同的裝飾器,從而實(shí)現(xiàn)不同的行為。 通過(guò)使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出通過(guò)使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合??梢允褂枚鄠€(gè)具體裝飾類來(lái)裝飾同一對(duì)象,得很多不同行為的組合。可以使用多個(gè)具體裝飾類來(lái)裝飾同一對(duì)象,得到功能更為強(qiáng)大的對(duì)象。到功能更為強(qiáng)大的對(duì)象。 具體構(gòu)件類與具體裝飾類可以獨(dú)立變化

31、,用戶可以根據(jù)需要增加新的具體構(gòu)件類與具體裝飾類可以獨(dú)立變化,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類,在使用時(shí)再對(duì)其進(jìn)行組合,原有代碼無(wú)須具體構(gòu)件類和具體裝飾類,在使用時(shí)再對(duì)其進(jìn)行組合,原有代碼無(wú)須改變,符合改變,符合“開閉原則開閉原則”。 缺點(diǎn)缺點(diǎn) 使用裝飾模式進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)將產(chǎn)生很多小對(duì)象,這些對(duì)象的區(qū)別在使用裝飾模式進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)將產(chǎn)生很多小對(duì)象,這些對(duì)象的區(qū)別在于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有所不同,同時(shí)還將產(chǎn)生很多具體裝飾類。這些裝飾類和小對(duì)象的產(chǎn)生所不同,同時(shí)還將產(chǎn)生很多具體裝飾類。這些

32、裝飾類和小對(duì)象的產(chǎn)生將增加系統(tǒng)的復(fù)雜度,加大學(xué)習(xí)與理解的難度。將增加系統(tǒng)的復(fù)雜度,加大學(xué)習(xí)與理解的難度。 這種比繼承更加靈活機(jī)動(dòng)的特性,也同時(shí)意味著裝飾模式比繼承更加這種比繼承更加靈活機(jī)動(dòng)的特性,也同時(shí)意味著裝飾模式比繼承更加易于出錯(cuò),排錯(cuò)也很困難,對(duì)于多次裝飾的對(duì)象,調(diào)試時(shí)尋找錯(cuò)誤可易于出錯(cuò),排錯(cuò)也很困難,對(duì)于多次裝飾的對(duì)象,調(diào)試時(shí)尋找錯(cuò)誤可能需要逐級(jí)排查,較為煩瑣能需要逐級(jí)排查,較為煩瑣。模式應(yīng)模式應(yīng)用用(1) (1) 在在javax.swingjavax.swing包中,可以通過(guò)裝飾模式動(dòng)態(tài)給一些構(gòu)件包中,可以通過(guò)裝飾模式動(dòng)態(tài)給一些構(gòu)件增加新的行為或改善其外觀顯示增加新的行為或改善其外觀

33、顯示。 如如JListJList構(gòu)件本身并不支持直接滾動(dòng),即沒(méi)有滾動(dòng)條,要構(gòu)件本身并不支持直接滾動(dòng),即沒(méi)有滾動(dòng)條,要?jiǎng)?chuàng)建可以滾動(dòng)的列表,可以使用如下代碼實(shí)現(xiàn):創(chuàng)建可以滾動(dòng)的列表,可以使用如下代碼實(shí)現(xiàn):(2) (2) 裝飾模式在裝飾模式在JDKJDK中最經(jīng)典的實(shí)例是中最經(jīng)典的實(shí)例是Java IOJava IO。3.3.適配器模式適配器模式模式動(dòng)模式動(dòng)機(jī)機(jī) 在在軟件開發(fā)中采用類似于電源適配器的設(shè)計(jì)和編碼技巧被稱為適軟件開發(fā)中采用類似于電源適配器的設(shè)計(jì)和編碼技巧被稱為適配器模式。配器模式。 通常客通??蛻舳丝梢酝ㄟ^(guò)目標(biāo)類的接口訪問(wèn)它所提供的服務(wù)。有戶端可以通過(guò)目標(biāo)類的接口訪問(wèn)它所提供的服務(wù)。有時(shí)現(xiàn)時(shí)

34、現(xiàn)有的類可以滿足客戶類的功能需要,但是它所提供的接口不一定是客有的類可以滿足客戶類的功能需要,但是它所提供的接口不一定是客戶類所期望的,這可能是因?yàn)楝F(xiàn)有類中方法名與目標(biāo)類中定義的方法戶類所期望的,這可能是因?yàn)楝F(xiàn)有類中方法名與目標(biāo)類中定義的方法名不一致等原因所導(dǎo)致的。名不一致等原因所導(dǎo)致的。 在在這種情況下,現(xiàn)有的接口需要轉(zhuǎn)化為客這種情況下,現(xiàn)有的接口需要轉(zhuǎn)化為客戶類期望的接口,這樣保證了對(duì)現(xiàn)有類的重用。如果不進(jìn)行這樣的轉(zhuǎn)戶類期望的接口,這樣保證了對(duì)現(xiàn)有類的重用。如果不進(jìn)行這樣的轉(zhuǎn)化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完成這化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完

35、成這樣的轉(zhuǎn)化。樣的轉(zhuǎn)化。 模模式定式定義義 將將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,適配器模式使接口不一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,適配器模式使接口不兼容的那些類可以一起工兼容的那些類可以一起工作。作。適配器模式既可以作為類結(jié)構(gòu)型模式,適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對(duì)象結(jié)構(gòu)型模式。也可以作為對(duì)象結(jié)構(gòu)型模式。adapteeAdapter+ request ().Adaptee+ specificRequest ().Clientadaptee.specificRequest();Target+ request ().模模式結(jié)式結(jié)構(gòu)(對(duì)象適配器)構(gòu)(對(duì)象適配器)角色:Targe

36、t:目標(biāo)抽象類Adapter:適配器類Adaptee:適配者類Client:客戶類模模式解式解析析 在在不能或不想修改原來(lái)的適配者接口和抽象目標(biāo)類接口時(shí),采用不能或不想修改原來(lái)的適配者接口和抽象目標(biāo)類接口時(shí),采用適配器模式可以將一個(gè)類的接口和另一個(gè)類的接口匹配起來(lái)。如向第適配器模式可以將一個(gè)類的接口和另一個(gè)類的接口匹配起來(lái)。如向第三方購(gòu)買了一些類、控件,如果沒(méi)有原代碼,這時(shí)使用適配器模式可三方購(gòu)買了一些類、控件,如果沒(méi)有原代碼,這時(shí)使用適配器模式可以統(tǒng)一對(duì)象訪問(wèn)接口。適配器模式更多的是強(qiáng)調(diào)對(duì)代碼的組織,而不以統(tǒng)一對(duì)象訪問(wèn)接口。適配器模式更多的是強(qiáng)調(diào)對(duì)代碼的組織,而不是功能的實(shí)現(xiàn)。是功能的實(shí)現(xiàn)。

37、模模式優(yōu)缺式優(yōu)缺點(diǎn)點(diǎn) 優(yōu)點(diǎn)優(yōu)點(diǎn) 一個(gè)對(duì)象適配器可以把多個(gè)不同的適配者適配到同一個(gè)目標(biāo),一個(gè)對(duì)象適配器可以把多個(gè)不同的適配者適配到同一個(gè)目標(biāo),也就是說(shuō),同一個(gè)適配器可以把適配者類和它的子類都適配也就是說(shuō),同一個(gè)適配器可以把適配者類和它的子類都適配到目標(biāo)接口。到目標(biāo)接口。 缺點(diǎn)缺點(diǎn) 如如果一定要置換掉適配者類的一個(gè)或多個(gè)方法,就只好先做果一定要置換掉適配者類的一個(gè)或多個(gè)方法,就只好先做一個(gè)適配者類的子類,將適配者類的方法置換掉,然后再把一個(gè)適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當(dāng)做真正的適配者進(jìn)行適配,實(shí)現(xiàn)過(guò)程較為適配者類的子類當(dāng)做真正的適配者進(jìn)行適配,實(shí)現(xiàn)過(guò)程較為復(fù)雜復(fù)雜

38、。模模式應(yīng)用式應(yīng)用(1) Java語(yǔ)言的數(shù)據(jù)庫(kù)連接工具JDBC給出一個(gè)客戶端通用的抽象接口,每一個(gè)具體數(shù)據(jù)庫(kù)引擎(如SQL Server、Oracle、MySQL等)的JDBC驅(qū)動(dòng)軟件都是一個(gè)介于JDBC接口和數(shù)據(jù)庫(kù)引擎接口之間的適配器軟件。抽象的JDBC接口和各個(gè)數(shù)據(jù)庫(kù)引擎API之間都需要相應(yīng)的適配器軟件,這就是為各個(gè)不同數(shù)據(jù)庫(kù)引擎準(zhǔn)備的驅(qū)動(dòng)程序。(2) 在Spring AOP框架中,對(duì)BeforeAdvice、AfterAdvice、ThrowsAdvice三種通知類型借助適配器模式來(lái)實(shí)現(xiàn)。4.4.組合模式組合模式模式動(dòng)模式動(dòng)機(jī):機(jī):組組合模式描述了如何將容器對(duì)象和葉子對(duì)象進(jìn)行遞合模式描述

39、了如何將容器對(duì)象和葉子對(duì)象進(jìn)行遞歸組合,使得用戶在使用時(shí)無(wú)須對(duì)它們進(jìn)行區(qū)分,可以一致地歸組合,使得用戶在使用時(shí)無(wú)須對(duì)它們進(jìn)行區(qū)分,可以一致地對(duì)待容器對(duì)象和葉子對(duì)象,這就是組合模式的模式動(dòng)機(jī)。對(duì)待容器對(duì)象和葉子對(duì)象,這就是組合模式的模式動(dòng)機(jī)。模模式定式定義:義:組合多個(gè)對(duì)象形成樹形結(jié)構(gòu)以表示組合多個(gè)對(duì)象形成樹形結(jié)構(gòu)以表示“整體整體- -部分部分”的結(jié)構(gòu)層次。組合模式對(duì)單個(gè)對(duì)象(即葉子對(duì)象)和組合對(duì)象的結(jié)構(gòu)層次。組合模式對(duì)單個(gè)對(duì)象(即葉子對(duì)象)和組合對(duì)象(即容器對(duì)象)的使用具有一致性。(即容器對(duì)象)的使用具有一致性。childrenClientComponent+operation ()add (Component c)remove (Component c)getChild (int i).Leaf+ operation ().Composite+operation ()add (Component c)remove (Component c)getChild

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論