![設(shè)計模式復習(2)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/f1ce3896-77fa-43bb-b61d-756511ca4d3d/f1ce3896-77fa-43bb-b61d-756511ca4d3d1.gif)
![設(shè)計模式復習(2)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/f1ce3896-77fa-43bb-b61d-756511ca4d3d/f1ce3896-77fa-43bb-b61d-756511ca4d3d2.gif)
![設(shè)計模式復習(2)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/f1ce3896-77fa-43bb-b61d-756511ca4d3d/f1ce3896-77fa-43bb-b61d-756511ca4d3d3.gif)
![設(shè)計模式復習(2)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/f1ce3896-77fa-43bb-b61d-756511ca4d3d/f1ce3896-77fa-43bb-b61d-756511ca4d3d4.gif)
![設(shè)計模式復習(2)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/14/f1ce3896-77fa-43bb-b61d-756511ca4d3d/f1ce3896-77fa-43bb-b61d-756511ca4d3d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、常常 文文 萃萃1.1.狀態(tài)模狀態(tài)模式式 模模式動機:式動機:為了解決系統(tǒng)中復雜對象的狀態(tài)轉(zhuǎn)換以及不為了解決系統(tǒng)中復雜對象的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下行為的封裝問題。同狀態(tài)下行為的封裝問題。 模模式定義式定義 :允允許一個對象在其內(nèi)部狀態(tài)改變時改變它的許一個對象在其內(nèi)部狀態(tà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)鍵是引入了一個抽象狀態(tài)類來專門表示對象的狀態(tài),而對象的每一種具體狀態(tài)類都繼承了該類,并在不同具體狀態(tài)類中實現(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)缺點點 優(yōu)點 封裝了轉(zhuǎn)換規(guī)則。 將所有與某個狀態(tài)有關(guān)的行為放到一個類中,并且可以方便地增加新的狀態(tài),只需要改變對象狀態(tài)即可改變對象的行為。 允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對象合成一體,而不是某一個巨大的條件語句塊。 缺點
3、狀態(tài)模式的使用必然會增加系統(tǒng)類和對象的個數(shù)。 狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)都較為復雜,如果使用不當將導致程序結(jié)構(gòu)和代碼的混亂。 狀態(tài)模式對“開閉原則”的支持并不太好,對于可以切換狀態(tài)的狀態(tài)模式,增加新的狀態(tài)類需要修改那些負責狀態(tài)轉(zhuǎn)換的源代碼,否則無法切換到新增狀態(tài);而且修改某個狀態(tài)類的行為也需修改對應類的源代碼。l 模模式應式應用:用:狀狀態(tài)模式在工作流或游戲等類型的軟件中得以廣泛使用,甚態(tài)模式在工作流或游戲等類型的軟件中得以廣泛使用,甚至可以用于這些系統(tǒng)的核心功能設(shè)計,如在政府至可以用于這些系統(tǒng)的核心功能設(shè)計,如在政府OA辦公系統(tǒng)辦公系統(tǒng)中,一個批文的狀態(tài)有多種:尚未辦理;正在辦理;正在批中,一個批
4、文的狀態(tài)有多種:尚未辦理;正在辦理;正在批示;正在審核;已經(jīng)完成等各種狀態(tài),而且批文狀態(tài)不同時示;正在審核;已經(jīng)完成等各種狀態(tài),而且批文狀態(tài)不同時對批文的操作也有所差異。使用狀態(tài)模式可以描述工作流對對批文的操作也有所差異。使用狀態(tài)模式可以描述工作流對象(如批文)的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下它所具有的行為。象(如批文)的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下它所具有的行為。 在在目前主流的角色扮演游戲)中,使用狀態(tài)模式可以對游戲目前主流的角色扮演游戲)中,使用狀態(tài)模式可以對游戲角色進行控制,游戲角色的升級伴隨著其狀態(tài)的變化和行為角色進行控制,游戲角色的升級伴隨著其狀態(tài)的變化和行為的變化。對于游戲程序本身也可以通過狀
5、態(tài)模式進行總控,的變化。對于游戲程序本身也可以通過狀態(tài)模式進行總控,一個游戲活動包括開始、運行、結(jié)束等狀態(tài),通過對狀態(tài)的一個游戲活動包括開始、運行、結(jié)束等狀態(tài),通過對狀態(tài)的控制可以控制系統(tǒng)的行為,決定游戲的各個方面,因此可以控制可以控制系統(tǒng)的行為,決定游戲的各個方面,因此可以使用狀態(tài)模式對整個游戲的架構(gòu)進行設(shè)計與實現(xiàn)。使用狀態(tài)模式對整個游戲的架構(gòu)進行設(shè)計與實現(xiàn)。2.2.模板方法模式模板方法模式 模式動模式動機:機:去飯店吃飯,無論吃什么,都包含點菜、吃飯、去飯店吃飯,無論吃什么,都包含點菜、吃飯、買單三個步驟。而吃什么卻因人而異。在軟件開發(fā)時會遇買單三個步驟。而吃什么卻因人而異。在軟件開發(fā)時會
6、遇到同樣的問題。模板方法解決這類問題。到同樣的問題。模板方法解決這類問題。 模式定義模式定義 定義一個操作中算法的框架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。模板方法是一種類行為型模式。 模式結(jié)模式結(jié)構(gòu)構(gòu)AbstractClassabstract +templateMethod ()primitiveOperation1 ()primitiveOperation2 ()primitiveOperation3 ().ConcreteClass+primitiveOperation1 ()primitiveOperation2 ().角色
7、:角色:AbstractClassAbstractClass: : 抽象類抽象類 ConcreteClassConcreteClass: : 具體子類具體子類 模式解模式解析析 一個模板方法是定義在抽象類中的、把基本操作方法組合在一起形成一個總算法或一個總行為的方法。模式優(yōu)缺模式優(yōu)缺點點 優(yōu)點模板方法模式在一個類中形式化地定義算法,而由它的子類實現(xiàn)細節(jié)的處理。模板方法模式是一種代碼復用的基本技術(shù)。模板方法模式導致一種反向的控制結(jié)構(gòu),通過一個父類調(diào)用其子類的操作,通過對子類的擴展增加新的行為,符合“開閉原則”。 缺點每個不同的實現(xiàn)都需要定義一個子類,這會導致類的個數(shù)增加,系統(tǒng)更加龐大,設(shè)計也更加
8、抽象,但是更加符合“單一職責原則”,使得類的內(nèi)聚性得以提高。模式應用模式應用 模板方法模式廣泛應用于框架設(shè)計中,以確保父類控制處理流程的邏輯順序(如框架的初始化)。3.3.訪問者模式訪問者模式模模式動式動機機 對于系統(tǒng)中的某些對象,它們存儲在同一個集合中,且具有不同的類型,而且對于該集合中的對象,可以接受一類稱為訪問者的對象來訪問,而且不同的訪問者其訪問方式有所不同,訪問者模式為解決這類問題而誕生。模式定義模式定義 表示一個作用于某對象結(jié)構(gòu)中的各元素的操作,它使我們可以在不改變各元素的類的前提下定義作用于這些元素的新操作。訪問者模式是一種對象行為型模式。模模式結(jié)式結(jié)構(gòu)構(gòu)接口接口接口接口角色:角
9、色:Vistor: 抽象訪問者抽象訪問者ConcreteVisitor: 具體訪問者具體訪問者Element: 抽象元素抽象元素ConcreteElement: 具體元素具體元素 ObjectStructure: 對象結(jié)構(gòu)對象結(jié)構(gòu)模模式解式解析析訪問者模式中對象結(jié)構(gòu)存儲了不同類型的元素對象,以供不訪問者模式中對象結(jié)構(gòu)存儲了不同類型的元素對象,以供不同訪問者訪問。同訪問者訪問。訪問者模式包括兩個層次結(jié)構(gòu),一個是訪問者層次結(jié)構(gòu),提訪問者模式包括兩個層次結(jié)構(gòu),一個是訪問者層次結(jié)構(gòu),提供了抽象訪問者和具體訪問者,一個是元素層次結(jié)構(gòu),提供供了抽象訪問者和具體訪問者,一個是元素層次結(jié)構(gòu),提供了抽象元素和具
10、體元素。了抽象元素和具體元素。相同的訪問者可以以不同的方式訪問不同的元素,相同的元相同的訪問者可以以不同的方式訪問不同的元素,相同的元素可以接受不同訪問者以不同訪問方式訪問。在訪問者模式素可以接受不同訪問者以不同訪問方式訪問。在訪問者模式中,增加新的訪問者無須修改原有系統(tǒng),系統(tǒng)具有較好的中,增加新的訪問者無須修改原有系統(tǒng),系統(tǒng)具有較好的可可擴展擴展性性。模模式優(yōu)缺式優(yōu)缺點點 優(yōu)點使得增加新的訪問操作變得很容易。將有關(guān)元素對象的訪問行為集中到一個訪問者對象中,而不是分散到一個個的元素類中。 可以跨過類的等級結(jié)構(gòu)訪問屬于不同的等級結(jié)構(gòu)的元素類。讓用戶能夠在不修改現(xiàn)有類層次結(jié)構(gòu)的情況下,定義該類層次
11、結(jié)構(gòu)的操作。 缺點增加新的元素類很困難。在訪問者模式中,每增加一個新的元素類都意味著要在抽象訪問者角色中增加一個新的抽象操作,并在每一個具體訪問者類中增加相應的具體操作,違背了“開閉原則”的要求。破壞封裝。訪問者模式要求訪問者對象訪問并調(diào)用每一個元素對象的操作,這意味著元素對象有時候必須暴露一些自己的內(nèi)部操作和內(nèi)部狀態(tài),否則無法供訪問者訪問。模模式應式應用用 一些編譯器的設(shè)計中運用了訪問者模式,程序代碼是被訪問的對象,它包括變量定義、變量賦值、邏輯運算、算術(shù)運算等語句,編譯器需要對代碼進行分析,如檢查變量是否定義、變量是否賦值、算術(shù)運算是否合法等,可以將不同的操作封裝在不同的類中,如檢查變量定
12、義的類、檢查變量賦值的類、檢查算術(shù)運算是否合法的類,這些類就是具體訪問者,可以訪問程序代碼中不同類型的語句。在編譯過程中除了代碼分析外,還包含代碼優(yōu)化、空間分配和代碼生成等部分,也可以將每一個不同編譯階段的操作封裝到了跟該階段有關(guān)的一個訪問者類中。4.4.策略模式策略模式模模式動式動機:機:完成一項任務,往往可以有多種不同的方式,每一種方式稱為一個策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的策略來完成該項任務。模式定模式定義義 定義一系列算法,將每一個算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨立于使用它的客戶而變化。策略模式是一種對象行為型模式。模模式結(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: 具體策略類模式解析模式解析 策略模式是對算法的封裝,它把算法的責任和算法本身分割開,委派給不同的對象管理。策略模式通常把一個系列的算法封裝到一系列的策略類里面,作為一個抽象策略類的子
14、類。用一句話來說,就是“準備一組算法,并將每一個算法封裝起來,使得它們可以互換”。 在策略模式中,由客戶端自己決定在什么情況下使用什么具體策略角色。模式優(yōu)缺點模式優(yōu)缺點 優(yōu)點策略模式提供了對“開閉原則”的完美支持,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為,也可以靈活地增加新的算法或行為。策略模式提供了管理相關(guān)的算法族的辦法。策略模式提供了可以替換繼承關(guān)系的辦法。使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。 缺點客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。 策略模式將造成產(chǎn)生很多策略類,可以通過使用享元模式在一定程度上減少對象的數(shù)量。模式應用模式應用(1) Java SE的容器布
15、局管理就是策略模式應用的一個經(jīng)典實例。 (2)在微軟公司提供的演示項目PetShop 4.0中使用策略模式來處理同步訂單和異步訂單的問題。5.5.觀察者模式觀察者模式模模式動式動機:機:建立一種對象與對象之間建立一種對象與對象之間的的依的的依賴關(guān)系,一個對賴關(guān)系,一個對象發(fā)生改變時將自動通知其他對象,其他對象將相應做出反應。象發(fā)生改變時將自動通知其他對象,其他對象將相應做出反應。在此,發(fā)生改變的對象稱為觀察目標,而被通知的對象稱為觀在此,發(fā)生改變的對象稱為觀察目標,而被通知的對象稱為觀察者,一個觀察目標可以對應多個觀察者,而且這些觀察者之察者,一個觀察目標可以對應多個觀察者,而且這些觀察者之間
16、沒有相互聯(lián)系,可以根據(jù)需要增加和刪除觀察者,使得系統(tǒng)間沒有相互聯(lián)系,可以根據(jù)需要增加和刪除觀察者,使得系統(tǒng)更易于擴展,這就是觀察者模式的模式動機。更易于擴展,這就是觀察者模式的模式動機。模式定模式定義:義:定義對象間的一種一對多依賴關(guān)系,使得每當一定義對象間的一種一對多依賴關(guān)系,使得每當一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新。更新。模模式結(jié)式結(jié)構(gòu)構(gòu)角色:Subject: 目標ConcreteSubject: 具體目標Observer: 觀察者ConcreteObserver: 具體觀察者模模式解式解析析觀察者模式描述了
17、如何建立對象與對象之間的依賴關(guān)系,如何構(gòu)造滿足這種需求的系統(tǒng)。這一模式中的關(guān)鍵對象是觀察目標和觀察者,一個目標可以有任意數(shù)目的與之相依賴的觀察者,一旦目標的狀態(tài)發(fā)生改變,所有的觀察者都將得到通知。作為對這個通知的響應,每個觀察者都將即時更新自己的狀態(tài),以與目標狀態(tài)同步,這種交互也稱為發(fā)布-訂閱(publish-subscribe)。目標是通知的發(fā)布者,它發(fā)出通知時并不需要知道誰是它的觀察者,可以有任意數(shù)目的觀察者訂閱它并接收通知。模模式優(yōu)缺點式優(yōu)缺點 優(yōu)點觀察者模式可以實現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,并定義了穩(wěn)定的消息更新傳遞機制,抽象了更新接口,使得可以有各種各樣不同的表示層作為具體觀察者角色
18、。觀察者模式在觀察目標和觀察者之間建立一個抽象的耦合。 觀察者模式支持廣播通信。觀察者模式符合“開閉原則”的要求。 缺點如果一個觀察目標對象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。如果在觀察者和觀察目標之間有循環(huán)依賴的話,觀察目標會觸發(fā)它們之間進行循環(huán)調(diào)用,可能導致系統(tǒng)崩潰。觀察者模式?jīng)]有相應的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標發(fā)生了變化。模式應用模式應用(1) JDK1.1版本及以后的各個版本中,事件處理模型采用基于觀察者模式的委派事件模型(Delegation Event Model, DEM)。 在DEM中,事件的發(fā)布者稱
19、為事件源(Event Source),而訂閱者叫做事件監(jiān)聽器(Event Listener),在這個過程中還可以通過事件對象(Event Object)來傳遞與事件相關(guān)的信息,可以在事件監(jiān)聽者的實現(xiàn)類中實現(xiàn)事件處理。事件源對象、事件監(jiān)聽對象(事件處理對象)和事件對象構(gòu)成了Java事件處理模型的三要素。(2) 除了AWT中的事件處理之外,Java語言解析XML的技術(shù)SAX2以及Servlet技術(shù)的事件處理機制都基于DEM,都是觀察者模式的應用。(3) 觀察者模式在軟件開發(fā)中應用非常廣泛,如某電子商務網(wǎng)站可以在執(zhí)行發(fā)送操作后給用戶多個發(fā)送商品打折信息,某團隊戰(zhàn)斗游戲中某隊友犧牲將給所有成員提示等等
20、,凡是涉及到一對一或者一對多的對象交互場景都可以使用觀察者模式。 1.1.代代理模式理模式模式動模式動機:機:在某些情況下,一個客戶不想或者不能直接引用在某些情況下,一個客戶不想或者不能直接引用一個對象,此時可以通過一個稱之為一個對象,此時可以通過一個稱之為“代理代理”的第三者來實的第三者來實現(xiàn)間接引用。代理對象可以在客戶端和目標對象之間起到中現(xiàn)間接引用。代理對象可以在客戶端和目標對象之間起到中介的作用,并且可以通過代理對象去掉客戶不能看到的內(nèi)容介的作用,并且可以通過代理對象去掉客戶不能看到的內(nèi)容和服務或者添加客戶需要的額外服務和服務或者添加客戶需要的額外服務。 通通過引入一個新的對象(如小圖
21、片和遠程代理對象)來過引入一個新的對象(如小圖片和遠程代理對象)來實現(xiàn)對真實對象的操作或者將新的對象作為真實對象的一個實現(xiàn)對真實對象的操作或者將新的對象作為真實對象的一個替身,這種實現(xiàn)機制即為代理模式,通過引入代理對象來間替身,這種實現(xiàn)機制即為代理模式,通過引入代理對象來間接訪問一個對象,這就是代理模式的模式動機。接訪問一個對象,這就是代理模式的模式動機。 preRequest();realSubject.request();postRequest();realSubjectSubject+ request ().Proxy- realSubject : RealSubject+preRequ
22、est ()request ()postRequest ().RealSubject+ request ().Client模模式定式定義:義:給某一個對象提供一個代理,并由代理對象控制給某一個對象提供一個代理,并由代理對象控制對原對象的引用對原對象的引用。它。它是一種對象結(jié)構(gòu)型模式。是一種對象結(jié)構(gòu)型模式。模式結(jié)構(gòu)模式結(jié)構(gòu)角色:Subject: 抽象主題角色Proxy: 代理主題角色RealSubject: 真實主題角色模模式解析式解析接口代理類實現(xiàn)類實現(xiàn)實現(xiàn)調(diào)用模模式優(yōu)缺式優(yōu)缺點點 優(yōu)點優(yōu)點 代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系
23、統(tǒng)的耦合度。低了系統(tǒng)的耦合度。 遠程代理使得客戶端可以訪問在遠程機器上的對象,遠遠程代理使得客戶端可以訪問在遠程機器上的對象,遠程機器可能具有更好的計算性能與處理速度,可以快速程機器可能具有更好的計算性能與處理速度,可以快速響應并處理客戶端請求。響應并處理客戶端請求。 虛擬代理通過使用一個小對象來代表一個大對象,可以虛擬代理通過使用一個小對象來代表一個大對象,可以減少系統(tǒng)資源的消耗,對系統(tǒng)進行優(yōu)化并提高運行速度。減少系統(tǒng)資源的消耗,對系統(tǒng)進行優(yōu)化并提高運行速度。 保護代理可以控制對真實對象的使用權(quán)限。保護代理可以控制對真實對象的使用權(quán)限。 缺缺點點 由于在客戶端和真實主題之間增加了代理對象,因
24、此有由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。些類型的代理模式可能會造成請求的處理速度變慢。 實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn)非實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn)非常復雜。常復雜。模模式應用式應用EJBEJB、Web ServiceWeb Service等分布式技術(shù)都是代理模式的應用。在等分布式技術(shù)都是代理模式的應用。在EJBEJB中中使用了使用了RMIRMI機制,遠程服務器中的企業(yè)級機制,遠程服務器中的企業(yè)級BeanBean在本地有一個樁代在本地有一個樁代理,客戶端通過樁來調(diào)用遠程對象中定義的方法,而無須直接與理,
25、客戶端通過樁來調(diào)用遠程對象中定義的方法,而無須直接與遠程對象交互。在遠程對象交互。在EJBEJB的使用中需要提供一個公共的接口,客戶的使用中需要提供一個公共的接口,客戶端針對該接口進行編程,無須知道樁以及遠程端針對該接口進行編程,無須知道樁以及遠程EJBEJB的實現(xiàn)細節(jié)。的實現(xiàn)細節(jié)。 Spring Spring 框架中的框架中的AOPAOP技術(shù)也是代理模式的應用,在技術(shù)也是代理模式的應用,在Spring AOPSpring AOP中應用了動態(tài)代理中應用了動態(tài)代理(Dynamic Proxy)(Dynamic Proxy)技術(shù)。技術(shù)。 2.2.裝飾模式裝飾模式模式動模式動機:機:裝飾模式以對客戶
26、透明的方式動態(tài)地給一個對象附裝飾模式以對客戶透明的方式動態(tài)地給一個對象附加上更多的責任,換言之,客戶端并不會覺得對象在裝飾前和裝加上更多的責任,換言之,客戶端并不會覺得對象在裝飾前和裝飾后有什么不同。裝飾模式可以在不需要創(chuàng)造更多子類的情況下,飾后有什么不同。裝飾模式可以在不需要創(chuàng)造更多子類的情況下,將對象的功能加以擴展。這就是裝飾模式的模式動機將對象的功能加以擴展。這就是裝飾模式的模式動機。componentComponent+ operation ().ConcreteComponent+ operation ().Decorator+ operation ().component.oper
27、ation();ConcreteDecoratorA- addedState : + operation ().ConcreteDecoratorB+operation ()addedBehavior ().super.operation();addedBehavior();模模式定式定義:義:動態(tài)地給一個對象增加一些額外的職動態(tài)地給一個對象增加一些額外的職責,責,就增加對象就增加對象功能來說,裝飾模式比生成子類實現(xiàn)更為靈活功能來說,裝飾模式比生成子類實現(xiàn)更為靈活。裝。裝飾模飾模式是式是一種對一種對象結(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)勢在于不會破壞類的封與繼承關(guān)系相比,關(guān)聯(lián)關(guān)系的主要優(yōu)勢在于不會破壞類的封裝性,而且繼承是一種耦合度較大的靜態(tài)關(guān)系,無法在程序裝性,而且繼承是一種耦合度較大的靜態(tài)關(guān)系,無法在程序運行時動態(tài)擴展。在軟件開發(fā)階段,關(guān)聯(lián)關(guān)系雖然不會比繼運行時動態(tài)擴展。在軟件開發(fā)階段,關(guān)聯(lián)關(guān)系雖然不會比繼承關(guān)系減少編碼量,但是到了軟件維護階段,由于關(guān)聯(lián)關(guān)系承關(guān)系減少編碼量,但是到了軟件維護階段,由于關(guān)聯(lián)關(guān)系使系統(tǒng)具有較好的松耦合性,因此使得系統(tǒng)更加容易維護。使系
29、統(tǒng)具有較好的松耦合性,因此使得系統(tǒng)更加容易維護。當然,關(guān)聯(lián)關(guān)系的缺點是比繼承關(guān)系要創(chuàng)建更多的對象。當然,關(guān)聯(lián)關(guān)系的缺點是比繼承關(guān)系要創(chuàng)建更多的對象。 使用裝飾模式來實現(xiàn)擴展比繼承更加靈活,它以對客戶透明使用裝飾模式來實現(xiàn)擴展比繼承更加靈活,它以對客戶透明的方式動態(tài)地給一個對象附加更多的責任。裝飾模式可以在的方式動態(tài)地給一個對象附加更多的責任。裝飾模式可以在不需要創(chuàng)造更多子類的情況下,將對象的功能加以擴展。不需要創(chuàng)造更多子類的情況下,將對象的功能加以擴展。 模模式優(yōu)缺式優(yōu)缺點點 優(yōu)點優(yōu)點 裝飾模式與繼承關(guān)系的目的都是要擴展對象的功能,但是裝飾模式可裝飾模式與繼承關(guān)系的目的都是要擴展對象的功能,但
30、是裝飾模式可以提供比繼承更多的靈活性。以提供比繼承更多的靈活性。 可以通過一種動態(tài)的方式來擴展一個對象的功能,通過配置文件可以可以通過一種動態(tài)的方式來擴展一個對象的功能,通過配置文件可以在運行時選擇不同的裝飾器,從而實現(xiàn)不同的行為。在運行時選擇不同的裝飾器,從而實現(xiàn)不同的行為。 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合??梢允褂枚鄠€具體裝飾類來裝飾同一對象,得很多不同行為的組合??梢允褂枚鄠€具體裝飾類來裝飾同一對象,得到功能更為強大的對象。到功能更為強大的對象。 具體構(gòu)件類與具體裝飾類可以獨立變化
31、,用戶可以根據(jù)需要增加新的具體構(gòu)件類與具體裝飾類可以獨立變化,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須具體構(gòu)件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須改變,符合改變,符合“開閉原則開閉原則”。 缺點缺點 使用裝飾模式進行系統(tǒng)設(shè)計時將產(chǎn)生很多小對象,這些對象的區(qū)別在使用裝飾模式進行系統(tǒng)設(shè)計時將產(chǎn)生很多小對象,這些對象的區(qū)別在于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有所不同,同時還將產(chǎn)生很多具體裝飾類。這些裝飾類和小對象的產(chǎn)生所不同,同時還將產(chǎn)生很多具體裝飾類。這些
32、裝飾類和小對象的產(chǎn)生將增加系統(tǒng)的復雜度,加大學習與理解的難度。將增加系統(tǒng)的復雜度,加大學習與理解的難度。 這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調(diào)試時尋找錯誤可易于出錯,排錯也很困難,對于多次裝飾的對象,調(diào)試時尋找錯誤可能需要逐級排查,較為煩瑣能需要逐級排查,較為煩瑣。模式應模式應用用(1) (1) 在在javax.swingjavax.swing包中,可以通過裝飾模式動態(tài)給一些構(gòu)件包中,可以通過裝飾模式動態(tài)給一些構(gòu)件增加新的行為或改善其外觀顯示增加新的行為或改善其外觀
33、顯示。 如如JListJList構(gòu)件本身并不支持直接滾動,即沒有滾動條,要構(gòu)件本身并不支持直接滾動,即沒有滾動條,要創(chuàng)建可以滾動的列表,可以使用如下代碼實現(xiàn):創(chuàng)建可以滾動的列表,可以使用如下代碼實現(xiàn):(2) (2) 裝飾模式在裝飾模式在JDKJDK中最經(jīng)典的實例是中最經(jīng)典的實例是Java IOJava IO。3.3.適配器模式適配器模式模式動模式動機機 在在軟件開發(fā)中采用類似于電源適配器的設(shè)計和編碼技巧被稱為適軟件開發(fā)中采用類似于電源適配器的設(shè)計和編碼技巧被稱為適配器模式。配器模式。 通常客通??蛻舳丝梢酝ㄟ^目標類的接口訪問它所提供的服務。有戶端可以通過目標類的接口訪問它所提供的服務。有時現(xiàn)時
34、現(xiàn)有的類可以滿足客戶類的功能需要,但是它所提供的接口不一定是客有的類可以滿足客戶類的功能需要,但是它所提供的接口不一定是客戶類所期望的,這可能是因為現(xiàn)有類中方法名與目標類中定義的方法戶類所期望的,這可能是因為現(xiàn)有類中方法名與目標類中定義的方法名不一致等原因所導致的。名不一致等原因所導致的。 在在這種情況下,現(xiàn)有的接口需要轉(zhuǎn)化為客這種情況下,現(xiàn)有的接口需要轉(zhuǎn)化為客戶類期望的接口,這樣保證了對現(xiàn)有類的重用。如果不進行這樣的轉(zhuǎn)戶類期望的接口,這樣保證了對現(xiàn)有類的重用。如果不進行這樣的轉(zhuǎn)化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完成這化,客戶類就不能利用現(xiàn)有類所提供的功能,適配器模式可以完
35、成這樣的轉(zhuǎn)化。樣的轉(zhuǎn)化。 模模式定式定義義 將將一個接口轉(zhuǎn)換成客戶希望的另一個接口,適配器模式使接口不一個接口轉(zhuǎn)換成客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工兼容的那些類可以一起工作。作。適配器模式既可以作為類結(jié)構(gòu)型模式,適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對象結(jié)構(gòu)型模式。也可以作為對象結(jié)構(gòu)型模式。adapteeAdapter+ request ().Adaptee+ specificRequest ().Clientadaptee.specificRequest();Target+ request ().模模式結(jié)式結(jié)構(gòu)(對象適配器)構(gòu)(對象適配器)角色:Targe
36、t:目標抽象類Adapter:適配器類Adaptee:適配者類Client:客戶類模模式解式解析析 在在不能或不想修改原來的適配者接口和抽象目標類接口時,采用不能或不想修改原來的適配者接口和抽象目標類接口時,采用適配器模式可以將一個類的接口和另一個類的接口匹配起來。如向第適配器模式可以將一個類的接口和另一個類的接口匹配起來。如向第三方購買了一些類、控件,如果沒有原代碼,這時使用適配器模式可三方購買了一些類、控件,如果沒有原代碼,這時使用適配器模式可以統(tǒng)一對象訪問接口。適配器模式更多的是強調(diào)對代碼的組織,而不以統(tǒng)一對象訪問接口。適配器模式更多的是強調(diào)對代碼的組織,而不是功能的實現(xiàn)。是功能的實現(xiàn)。
37、模模式優(yōu)缺式優(yōu)缺點點 優(yōu)點優(yōu)點 一個對象適配器可以把多個不同的適配者適配到同一個目標,一個對象適配器可以把多個不同的適配者適配到同一個目標,也就是說,同一個適配器可以把適配者類和它的子類都適配也就是說,同一個適配器可以把適配者類和它的子類都適配到目標接口。到目標接口。 缺點缺點 如如果一定要置換掉適配者類的一個或多個方法,就只好先做果一定要置換掉適配者類的一個或多個方法,就只好先做一個適配者類的子類,將適配者類的方法置換掉,然后再把一個適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當做真正的適配者進行適配,實現(xiàn)過程較為適配者類的子類當做真正的適配者進行適配,實現(xiàn)過程較為復雜復雜
38、。模模式應用式應用(1) Java語言的數(shù)據(jù)庫連接工具JDBC給出一個客戶端通用的抽象接口,每一個具體數(shù)據(jù)庫引擎(如SQL Server、Oracle、MySQL等)的JDBC驅(qū)動軟件都是一個介于JDBC接口和數(shù)據(jù)庫引擎接口之間的適配器軟件。抽象的JDBC接口和各個數(shù)據(jù)庫引擎API之間都需要相應的適配器軟件,這就是為各個不同數(shù)據(jù)庫引擎準備的驅(qū)動程序。(2) 在Spring AOP框架中,對BeforeAdvice、AfterAdvice、ThrowsAdvice三種通知類型借助適配器模式來實現(xiàn)。4.4.組合模式組合模式模式動模式動機:機:組組合模式描述了如何將容器對象和葉子對象進行遞合模式描述
39、了如何將容器對象和葉子對象進行遞歸組合,使得用戶在使用時無須對它們進行區(qū)分,可以一致地歸組合,使得用戶在使用時無須對它們進行區(qū)分,可以一致地對待容器對象和葉子對象,這就是組合模式的模式動機。對待容器對象和葉子對象,這就是組合模式的模式動機。模模式定式定義:義:組合多個對象形成樹形結(jié)構(gòu)以表示組合多個對象形成樹形結(jié)構(gòu)以表示“整體整體- -部分部分”的結(jié)構(gòu)層次。組合模式對單個對象(即葉子對象)和組合對象的結(jié)構(gòu)層次。組合模式對單個對象(即葉子對象)和組合對象(即容器對象)的使用具有一致性。(即容器對象)的使用具有一致性。childrenClientComponent+operation ()add (Component c)remove (Component c)getChild (int i).Leaf+ operation ().Composite+operation ()add (Component c)remove (Component c)getChild
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)村電商行業(yè)監(jiān)管與政策支持方案
- 機械加工與測量技術(shù)作業(yè)指導書
- 房地產(chǎn)項目投資協(xié)議書年
- 調(diào)味品買賣合同年
- 三農(nóng)產(chǎn)品流通體系建設(shè)工作方案
- 勞務派遣標準勞務派遣合同
- 2025年吉林貨運從業(yè)資格證模擬考試答案
- 2025年山東貨運從業(yè)資格考試試題及答案大全
- 電力合同履行監(jiān)督合同(2篇)
- 2024-2025學年高中政治課時作業(yè)3感受文化影響含解析新人教版必修3
- 家具廠各崗位責任制匯編
- 顳下頜關(guān)節(jié)盤復位固定術(shù)后護理查房
- 硝苯地平控釋片
- 四川省瀘州市2019年中考物理考試真題與答案解析
- 部編版語文六年級下冊全套單元基礎(chǔ)??紲y試卷含答案
- 提高檢驗標本合格率品管圈PDCA成果匯報
- 2023年保險養(yǎng)老地產(chǎn)行業(yè)分析報告
- 世界古代史-對接選擇性必修(真題再現(xiàn)) 高考歷史一輪復習
- 保險公司防火應急預案
- 動物檢疫技術(shù)-動物檢疫的分類(動物防疫與檢疫技術(shù))
- 2024醫(yī)師資格考試考生誠信考試承諾書
評論
0/150
提交評論