軟件設(shè)計(jì)模式(Java版)_第1頁
軟件設(shè)計(jì)模式(Java版)_第2頁
軟件設(shè)計(jì)模式(Java版)_第3頁
軟件設(shè)計(jì)模式(Java版)_第4頁
軟件設(shè)計(jì)模式(Java版)_第5頁
已閱讀5頁,還剩316頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第1章軟件設(shè)計(jì)模式基礎(chǔ)內(nèi)容簡介?本章教學(xué)目標(biāo):

了解軟件設(shè)計(jì)模式的產(chǎn)生背景;

掌握軟件設(shè)計(jì)模式的概念、意義和基本要素;

明白GoF的23種設(shè)計(jì)模式的分類與特點(diǎn);

理解UML類之間的關(guān)系,并學(xué)會類圖的畫法;

正確理解面向?qū)ο蟮钠叻N設(shè)計(jì)原則。?本章重點(diǎn)內(nèi)容:

GoF的23種設(shè)計(jì)模式的分類與特點(diǎn);

UML中的類之間的關(guān)系;

UML中的類圖的畫法;

面向?qū)ο蟮钠叻N設(shè)計(jì)原則。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述1.1.1軟件設(shè)計(jì)模式的產(chǎn)生背景

“設(shè)計(jì)模式”這個術(shù)語最初并不是出現(xiàn)在軟件設(shè)計(jì)中,而是被用于建筑領(lǐng)域的設(shè)計(jì)中。1977年,美國著名建筑大師、加利福尼亞大學(xué)伯克利分校環(huán)境結(jié)構(gòu)中心主任ChristopherAlexander(克里斯托弗?亞歷山大)在他的著作《建筑模式語言:城鎮(zhèn)、建筑、構(gòu)造》中描述了一些常見的建筑設(shè)計(jì)問題,并提出了253種關(guān)于城鎮(zhèn)、鄰里、住宅、花園和房間等進(jìn)行設(shè)計(jì)的基本模式。

1987年,肯特·貝克和沃德·坎寧安首先將克里斯托佛·亞歷山大的模式思想應(yīng)用在Smalltalk中的圖形用戶接口的生成中。直到1990年,軟件工程界才開始研討設(shè)計(jì)模式的話題,后來召開了多次關(guān)于設(shè)計(jì)模式的研討會。直到1995年,ErichGamma,RichardHelm,RalphJohnson,JohnVlissides等四位作者合作出版了《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書,在此書中共收錄了23個設(shè)計(jì)模式,這是設(shè)計(jì)模式領(lǐng)域里程碑的事件,導(dǎo)致了軟件設(shè)計(jì)模式的突破。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.2軟件設(shè)計(jì)模式的概念與意義

1.什么是軟件設(shè)計(jì)模式?軟件設(shè)計(jì)模式(SoftwareDesignpattern),又稱設(shè)計(jì)模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。

2.學(xué)習(xí)設(shè)計(jì)模式的意義⑴可以提高程序員的思維能力、編程能力和設(shè)計(jì)能力。⑵使程序設(shè)計(jì)更加標(biāo)準(zhǔn)化、代碼編制更加工程化,使軟件開發(fā)效率大大提高,從而縮短軟件的開發(fā)周期。⑶使設(shè)計(jì)的代碼可重用性高、可讀性強(qiáng)、可靠性高、靈活性好、可維護(hù)性強(qiáng)。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.3軟件設(shè)計(jì)模式的基本要素

其基本要素有:模式名稱、別名、動機(jī)、問題、解決方案、效果、結(jié)構(gòu)、模式角色、合作關(guān)系、實(shí)現(xiàn)方法、適用性、已知應(yīng)用、例程、模式擴(kuò)展和相關(guān)模式等,其中最關(guān)鍵的元素包括以下四個主要部分:

1.模式名稱(PatternName)2.問題(Problem)3.解決方案(Solution)4.效果(Consequence)軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介設(shè)計(jì)模式有兩種分類方法,即:根據(jù)目的分和根據(jù)作用的范圍分。

1.根據(jù)目的來分⑴創(chuàng)建型模式:用于描述“怎樣創(chuàng)建對象”,它的主要特點(diǎn)是“將對象的創(chuàng)建與使用分離”。GoF中提供了5種創(chuàng)建型模式。⑵結(jié)構(gòu)型模式:用于描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu),GoF中提供了7種結(jié)構(gòu)型模式。⑶行為型模式:用于描述類或?qū)ο笾g怎樣相互協(xié)作共同完成單個對象都無法單獨(dú)完成的任務(wù),以及怎樣分配職責(zé)。GoF中提供了11種行為型模式。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介(續(xù))

1.根據(jù)作用范圍來分⑴類模式:用于處理類與子類之間的繼承關(guān)系,這些關(guān)系是靜態(tài)的。⑵對象模式:用于處理對象之間的組合或聚合關(guān)系,具動態(tài)性。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介(續(xù))

3.GoF的23種設(shè)計(jì)模式的功能?單例(Singleton)模式:某個類只能生成一個實(shí)例,該類提供了一個全局訪問點(diǎn)供外部獲取該實(shí)例,其拓展是有限多例模式。?原型(Prototype)模式:將一個對象作為原型,通過對其進(jìn)行復(fù)制而克隆出多個和原型類似的新實(shí)例。?工廠方法(FactoryMethod)模式:定義一個用于創(chuàng)建產(chǎn)品的接口,由子類決定生產(chǎn)什么產(chǎn)品。?抽象工廠(AbstractFactory)模式:提供一個創(chuàng)建產(chǎn)品族的接口,其每個子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介(續(xù))

3.GoF的23種設(shè)計(jì)模式的功能(續(xù))?建造者(Builder)模式:將一個復(fù)雜對象分解成多個相對簡單的部分,然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對象。?代理(Proxy)模式:為某對象提供一種代理以控制對該對象的訪問。即客戶端通過代理間接地訪問該對象,從而限制、增強(qiáng)或修改該對象的一些特性。?適配器(Adapter)模式:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介(續(xù))

3.GoF的23種設(shè)計(jì)模式的功能(續(xù))?橋接(Bridge)模式:將抽象與實(shí)現(xiàn)分離,使他們可以獨(dú)立的變化。它是用組合關(guān)系代替繼承關(guān)系來實(shí)現(xiàn),從而降低了抽象和實(shí)現(xiàn)這2個可變維度的耦合度。?裝飾(Decorator)模式:動態(tài)的給對象增加一些職責(zé),即增加其額外的功能。?外觀(Facade)模式:為多個復(fù)雜的子系統(tǒng)提供一個一致的接口,使這些子系統(tǒng)更加容易被訪問。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介(續(xù))

3.GoF的23種設(shè)計(jì)模式的功能(續(xù))?享元(Flyweight)模式:運(yùn)用共享技術(shù)來有效地支持大量細(xì)粒度對象的復(fù)用。?組合(Composite)模式:將對象組合成樹狀層次結(jié)構(gòu),使用戶對單個對象和組合對象具有一致的訪問性。?模板方法(TemplateMethod)模式:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介(續(xù))

3.GoF的23種設(shè)計(jì)模式的功能(續(xù))?策略(Strategy)模式:定義了一系列算法,并將每個算法封裝起來,使他們可以相互替換,且算法的改變不會影響到使用算法的客戶。?命令(Command)模式:將一個請求封裝為一個對象,使發(fā)出請求的責(zé)任和執(zhí)行請求的責(zé)任分割開。?職責(zé)鏈(ChainofResponsibility)模式:把請求從鏈中的一個對象傳到下一個對象,直到請求被響應(yīng)為止。通過這種方式去除對象之間的耦合。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介(續(xù))

3.GoF的23種設(shè)計(jì)模式的功能(續(xù))?狀態(tài)(State)模式:允許一個對象在其內(nèi)部狀態(tài)發(fā)生改變時改變其行為能力。?觀察者(Observer)模式:多個對象間存在一對多關(guān)系,當(dāng)一個對象發(fā)生改變時,把這種改變通知給其它多個對象,從而影響其它對象的行為。?中介者(Mediator)模式:定義一個中介對象來簡化原有對象之間的交互關(guān)系,降低系統(tǒng)中對象間的耦合度,使原有對象之間不必相互了解。軟件設(shè)計(jì)模式(Java版)、1.1軟件設(shè)計(jì)模式概述(續(xù))1.1.4GoF的23種設(shè)計(jì)模式簡介(續(xù))

3.GoF的23種設(shè)計(jì)模式的功能(續(xù))?迭代器(Iterator)模式:提供一種方法來順序訪問聚合對象中的一系列數(shù)據(jù),而不暴露聚合對象的內(nèi)部表示。?訪問者(Visitor)模式:在不改變集合元素的前提下,為一個集合中的每個元素提供多種訪問方式,即每個元素有多個訪問者對象訪問。?備忘錄(Memento)模式:在不破壞封裝性的前提下,獲取并保存一個對象的內(nèi)部狀態(tài),以便以后恢復(fù)它。?解釋器(Interpreter)模式:提供如何定義語言的文法,以及對語言句子的解釋方法,即解釋器。軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖1.2.1統(tǒng)一建模語言簡介

?統(tǒng)一建模語言(UnifiedModelingLanguage,簡稱:UML):是用來設(shè)計(jì)軟件藍(lán)圖的可視化建模語言,1997年被國際對象組織OMG采納為為面向?qū)ο蟮慕UZ言的國際標(biāo)準(zhǔn)。?它的特點(diǎn):是簡單、統(tǒng)一、圖形化、能表達(dá)軟件設(shè)計(jì)中的動態(tài)與靜態(tài)信息。?UML從目標(biāo)系統(tǒng)的不同角度出發(fā),定義了:用例圖、類圖、對象圖、狀態(tài)圖、活動圖、序列圖、協(xié)作圖、構(gòu)件圖、部署圖等9種圖。注:本教材主要介紹軟件設(shè)計(jì)模式中經(jīng)常用到的類圖,以及類之間的關(guān)系。軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))1.2.2類、接口和類圖

1.類(Class)類是指具有相同屬性、方法和關(guān)系的對象的抽象,它具有封裝性、繼承性和多態(tài)性等三大特性。在UML中類包含:⑴類名(Name)是一個字符串,如:Student。⑵屬性(Attribute)是指類的特性,即類的成員變量。格式:

[可見性]屬性名:類型[=缺省值]注意:“可見性”表示該屬性對于類外的元素而言是否可見,在類圖中分別用符號+、-、#、~表示。如:-name:String⑶操作(Operations)是類的成員方法。格式:

[可見性]名稱(參數(shù)列表)[:返回類型]軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))下圖是學(xué)生類的UML表示:軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.2UML中的類圖(續(xù))1.2.2類、接口和類圖

2.接口(Interface)接口是一種特殊的類,它包含抽象操作,但不包含屬性。它描述了類或組件對外可見的動作。下圖是圖形類接口的UML表示:軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))1.2.2類、接口和類圖

3.類圖(ClassDiagram)類圖是用來顯示系統(tǒng)中的類、接口、協(xié)作以及它們之間的靜態(tài)結(jié)構(gòu)和關(guān)系的一種靜態(tài)模型。右邊是“計(jì)算長方形和圓形的周長與面積”的類圖:軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系

1.依賴(Dependency)關(guān)系依賴關(guān)系是一種使用關(guān)系,它是對象之間耦合度最弱的一種關(guān)聯(lián)方式。在代碼中,某個類的方法通過局部變量、方法的參數(shù)或者對靜態(tài)方法的調(diào)用來訪問另一個類(被依賴類)中的某些方法來完成一些職責(zé)。軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系

2.關(guān)聯(lián)(Association)關(guān)系關(guān)聯(lián)關(guān)系是對象之間的一種引用關(guān)系,用于表示一類對象與另一類對象之間的聯(lián)系,如老師和學(xué)生、師傅和徒弟、丈夫和妻子等。關(guān)聯(lián)關(guān)系分為一般關(guān)聯(lián)關(guān)系、聚合關(guān)系和組合關(guān)系,我們先介紹一般關(guān)聯(lián)。關(guān)聯(lián)可以是雙向的,也可以是單向的。軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系

3.聚合(Aggregation)關(guān)系聚合關(guān)系是強(qiáng)關(guān)聯(lián)關(guān)系,是整體和部分之間的關(guān)系,是has-a的關(guān)系。聚合關(guān)系也是通過成員對象來實(shí)現(xiàn)的,其中成員對象是整體對象的一部分,但是成員對象可以脫離整體對象而獨(dú)立存在。例如,學(xué)校與老師的關(guān)系,學(xué)校包含老師,但如果學(xué)校停辦了,老師依然存在。軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系

4.組合(Composition)關(guān)系組合關(guān)系也表示類之間的整體與部分的關(guān)系,但它是一種更強(qiáng)烈的聚合關(guān)系,是contains-a關(guān)系。整體對象可以控制部分對象的生命周期,一旦整體對象不存在,部分對象也將不存在,部分對象不能脫離整體對象而存在。例如,頭和嘴的關(guān)系,沒有了頭,嘴也就不存在了。軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系

5.泛化(Generalization)關(guān)系泛化關(guān)系是對象之間耦合度最大的一種關(guān)系,表示一般與特殊的關(guān)系,是父類與子類之間的關(guān)系,是一種繼承關(guān)系,是is-a的關(guān)系。軟件設(shè)計(jì)模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系

6.實(shí)現(xiàn)(Realization)關(guān)系實(shí)現(xiàn)關(guān)系是接口與實(shí)現(xiàn)類之間的關(guān)系。在UML類圖中,實(shí)現(xiàn)關(guān)系使用帶空心三角箭頭的虛線來表示,箭頭從實(shí)現(xiàn)類指向接口。例如,汽車和船實(shí)現(xiàn)了交通工具,其類圖如下:軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則1.3.1開閉原則

1.開閉原則的定義開閉原則(OCP):軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉。勃蘭特·梅耶(BertrandMeyer)在1988年的著作《面向?qū)ο筌浖?gòu)造》中提出,這里的軟件實(shí)體包括以下幾個部分:1)項(xiàng)目中劃分出的模塊;2)類與接口;3)方法。

2.開閉原則的重要性⑴對軟件測試的影響,軟件測試時只需要對擴(kuò)展的代碼進(jìn)行測試就。⑵可以提高代碼的可復(fù)用性。⑶可以提高軟件的可維護(hù)性,易于擴(kuò)展和維護(hù)。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.開閉原則的實(shí)現(xiàn)方法可以通過“抽象約束、封裝變化”來實(shí)現(xiàn)開閉原則,即通過接口或者抽象類為軟件實(shí)體定義一個相對穩(wěn)定的抽象層,而將相同的可變因素封裝在相同的具體實(shí)現(xiàn)類中。

【例1.1】Windows的桌面主題設(shè)計(jì)。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))1.3.2里氏替換原則

1.里氏替換原則的定義里氏替換原則(LSP):繼承必須確保超類所擁有的性質(zhì)在子類中仍然成立。由麻省理工學(xué)院計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室的Liskov女士在1987年的OOPSLA(面向?qū)ο蠹夹g(shù)的高峰會議)上發(fā)表的一篇文章《數(shù)據(jù)抽象和層次》里面提出來的。

2.里氏替換原則的重要性⑴里氏替換原則是實(shí)現(xiàn)開閉原則的重要方式之一。⑵它克服了繼承中重寫父類造成的可復(fù)用性變差的缺點(diǎn)。⑶它是動作正確性的保證。即類的擴(kuò)展不會給已有的系統(tǒng)引入新的錯誤,降低了代碼出錯的可能性。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.里氏替換原則的實(shí)現(xiàn)方法

子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。

【例1.2】里氏替換原則在“幾維鳥不是鳥”實(shí)例中的應(yīng)用。

分析:鳥一般都會飛行,如燕子的飛行速度大概是每小時可達(dá)120公里。但是新西蘭的“幾維鳥”,由于翅膀退化,因此無法飛行。//程序代碼見附件軟件設(shè)計(jì)模式(Java版)、說明:以上類圖違背了“里氏替換原則”,要改。1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))以上程序運(yùn)行錯誤的原因是:幾維鳥類重寫了鳥類的setSpeed(doublespeed)方法,這違背了里氏替換原則。正確的做法是:取消幾維鳥原來的繼承關(guān)系,定義鳥和幾維鳥的更一般的父類,如動物類,它們都有奔跑的能力。右邊是其類圖:軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))1.3.3依賴倒置原則

1.依賴倒置原則的定義依賴倒置原則(DIP)的含義是:高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。其核心思想是:要面向接口編程,不要面向?qū)崿F(xiàn)編程。是ObjectMentor公司總裁RobertC.Martin于1996年在C++Report上發(fā)表的文章中提出的。

2.依賴倒置原則的重要性⑴依賴倒置原則可以降低類間的耦合性。⑵依賴倒置原則可以提高系統(tǒng)的穩(wěn)定性。⑶依賴倒置原則可以減少并行開發(fā)引起的風(fēng)險。⑷依賴倒置原則可以提高代碼的可讀性和可維護(hù)性。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.依賴倒置原則的實(shí)現(xiàn)方法我們在實(shí)際編程中只要遵循以下四點(diǎn),就能在項(xiàng)目中滿足這個規(guī)則:

⑴每個類盡量提供接口或抽象類,或者兩者都具備。⑵變量的聲明類型盡量是接口或者是抽象類。⑶任何類都不應(yīng)該從具體類派生。⑷使用繼承時盡量遵循里氏替換原則。

【例1.3】依賴倒置原則在“顧客購物程序”中的應(yīng)用。

分析:如顧客類的shopping(ShaoguanShopshop)方法只訪問韶關(guān)網(wǎng)店,如果該顧客想從另外一家商店(如:婺源網(wǎng)店WuyuanShop)購物,就要修改該方法的參數(shù)類型,這違背了“依賴倒置”原則。解決方法是:定義一個商店接口Shop,顧客類面向該接口編程,其類圖如下。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))下面是顧客購物程序的類圖,其程序源代碼見附件。軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))1.3.4單一職責(zé)原則

1.單一職責(zé)原則的定義單一職責(zé)原則(SRP)規(guī)定一個類應(yīng)該有且僅有一個引起它變化的原因,否則類應(yīng)該被拆分。由羅伯特·C·馬丁(RobertC.Martin)于《敏捷軟件開發(fā):原則、模式和實(shí)踐》一書中給出的。

2.單一職責(zé)原則的重要性⑴降低類的復(fù)雜度。⑵提高類的可讀性。復(fù)雜性降低,自然其可讀性會提高。⑶提高系統(tǒng)的可維護(hù)性。可讀性提高,那自然更容易維護(hù)了。⑷變更引起的風(fēng)險降低。變更是必然的,如果單一職責(zé)原則遵守得好,當(dāng)修改一個功能時,可以顯著降低對其他功能的影響。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.單一職責(zé)原則的實(shí)現(xiàn)方法單一職責(zé)原則是最簡單但又最難運(yùn)用的原則,需要設(shè)計(jì)人員發(fā)現(xiàn)類的不同職責(zé)并將其分離,再封裝到不同的類或模塊中。而發(fā)現(xiàn)類的多重職責(zé)需要設(shè)計(jì)人員具有較強(qiáng)的分析設(shè)計(jì)能力和相關(guān)重構(gòu)經(jīng)驗(yàn)。

【例1.4】大學(xué)學(xué)生工作管理程序。

分析:大學(xué)學(xué)生工作主要包括學(xué)生生活輔導(dǎo)和學(xué)生學(xué)業(yè)指導(dǎo)兩個方面的工作,其中生活輔導(dǎo)主要包括班委建設(shè)、出勤統(tǒng)計(jì)、心理輔導(dǎo)、費(fèi)用催繳、班級管理等工作,學(xué)業(yè)指導(dǎo)主要包括專業(yè)引導(dǎo)、學(xué)習(xí)輔導(dǎo)、科研指導(dǎo)、學(xué)習(xí)總結(jié)等工作。如果將這些工作交給一位老師負(fù)責(zé)顯然不合理,正確的做法是生活輔導(dǎo)由輔導(dǎo)員負(fù)責(zé),學(xué)業(yè)指導(dǎo)由學(xué)業(yè)導(dǎo)師負(fù)責(zé),其類圖如下。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))大學(xué)學(xué)生工作管理程序的類圖如下:軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))1.3.5接口隔離原則

1.接口隔離原則的定義接口隔離原則(ISP)含義是:客戶端不應(yīng)該被迫依賴于它不使用的方法。2002年羅伯特·C·馬丁在《敏捷軟件開發(fā):原則、模式和實(shí)踐》一書中提出,它要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感興趣的方法。

2.接口隔離原則的重要性⑴將臃腫龐大的接口分解,可以預(yù)防外來變更的擴(kuò)散。⑵接口隔離提高了系統(tǒng)的內(nèi)聚性,減少了對外交互。⑶如果接口的粒度大小定義合理,能夠保證系統(tǒng)的穩(wěn)定性。⑷使用多個專門的接口還能夠體現(xiàn)對象的層次。⑸能減少項(xiàng)目工程中的代碼冗余。過大的接口里面通常放置許多不用的方法。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.接口隔離原則的實(shí)現(xiàn)方法在具體應(yīng)用接口隔離原則時,應(yīng)該根據(jù)以下幾個規(guī)則來衡量:

⑴接口盡量小,但是要有限度。⑵只提供調(diào)用者需要的方法,屏蔽不需要的方法。⑶了解環(huán)境,拒絕盲從。⑷提高內(nèi)聚,減少對外交互。

【例1.5】學(xué)生成績管理程序。

分析:學(xué)生成績管理程序一般包含插入成績、刪除成績、修改成績、計(jì)算總分、計(jì)算均分、打印成績信息、查詢成績信息等功能,如果將這些功能全部放到一個接口中顯然不太合理,正確的做法是將它們分別放在輸入模塊、統(tǒng)計(jì)模塊和打印模塊等3個模塊中,其類圖如下。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.接口隔離原則的實(shí)現(xiàn)方法右邊是學(xué)生成績管理程序的類圖://其程序代碼見附件軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))1.3.6迪米特法則

1.迪米特法則的定義迪米特法則(LoD)又叫作最少知識原則(LKP),其定義是:只與你的直接朋友交談,不跟“陌生人”說話。1987年美國東北大學(xué)的IanHolland提出,后來又因?yàn)樵诮?jīng)典著作《程序員修煉之道》而廣為人知。迪米特法則中的“朋友”是指:當(dāng)前對象本身、當(dāng)前對象的成員對象、當(dāng)前對象所創(chuàng)建的對象、當(dāng)前對象的方法參數(shù)等,這些對象同當(dāng)前對象存在關(guān)聯(lián)、聚合或組合關(guān)系,可以直接訪問這些對象的方法。

2.迪米特法則的重要性⑴降低了類之間的耦合度,提高了模塊的相對獨(dú)立性。⑵由于耦合度降低,從而提高了類的可復(fù)用率和系統(tǒng)的擴(kuò)展性。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.迪米特法則的實(shí)現(xiàn)方法在運(yùn)用迪米特法則時要注意以下六點(diǎn):

⑴在類的劃分上,應(yīng)該創(chuàng)建弱耦合的類。⑵在類的結(jié)構(gòu)設(shè)計(jì)上,盡量降低類成員的訪問權(quán)限。⑶在類的設(shè)計(jì)上,優(yōu)先考慮將一個類設(shè)置成不變類。⑷在對其他類的引用上,將引用其它對象的次數(shù)降到最低。⑸不暴露類的屬性成員,而應(yīng)該提供相應(yīng)的訪問器(set和get方法)。⑹謹(jǐn)慎使用序列化(Serializable)功能。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))

【例1.6】明星與經(jīng)紀(jì)人的關(guān)系實(shí)例。

分析:明星由于全身心投入藝術(shù),所以許多日常事務(wù)由經(jīng)紀(jì)人負(fù)責(zé)處理,如:與粉絲的見面會,與媒體公司的業(yè)務(wù)洽淡等。這里的經(jīng)紀(jì)人是明星的朋友,而粉絲和媒體公司是陌生人,所以適合使用迪米特法則,右邊是其類圖:軟件設(shè)計(jì)模式(Java版)、//其程序代碼見附件1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))1.3.7合成復(fù)用原則

1.合成復(fù)用原則的定義合成復(fù)用原則(CRP)又叫組合/聚合復(fù)用原則(CARP)。它要求在軟件復(fù)用時,要盡量先使用組合或者聚合等關(guān)聯(lián)關(guān)系來實(shí)現(xiàn),其次才考慮使用繼承關(guān)系來實(shí)現(xiàn)。如果要使用繼承關(guān)系,則必須遵循里氏代換原則。

2.合成復(fù)用原則的重要性⑴它維持了類的封裝性。因?yàn)槌煞謱ο蟮膬?nèi)部細(xì)節(jié)是新對象看不見的,所以這種復(fù)用又稱為“黑箱”復(fù)用;⑵新舊類之間的耦合度低。這種復(fù)用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口;⑶復(fù)用的靈活性高。這種復(fù)用可以在運(yùn)行時動態(tài)進(jìn)行,新對象可以動態(tài)地引用與成分對象類型相同的對象。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.合成復(fù)用原則的實(shí)現(xiàn)方法合成復(fù)用原則是通過將已有的對象納入到新對象中,作為新對象的成員對象來實(shí)現(xiàn)的,新對象可以調(diào)用已有對象的功能,從而達(dá)到復(fù)用。下面以汽車分類管理程序?yàn)槔齺斫榻B合成復(fù)用原則的應(yīng)用。

【例1.7】汽車分類管理程序。

分析:汽車按“動力源”劃分可分為汽油汽車、電動汽車等,按“顏色”劃分可分為白色汽車、黑色汽車和紅色汽車等,如果同時考慮這兩種分類,其組合就很多。軟件設(shè)計(jì)模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))以下是用繼承關(guān)系實(shí)現(xiàn)的汽車分類的類圖:軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))可能看出可以看出用繼承關(guān)系實(shí)現(xiàn)會產(chǎn)生很多子類,而且增加新的“動力源”或者增加新的“顏色”都要修改源代碼,這違背了“開-閉”原則,顯然不可取。但如果改用組合關(guān)系實(shí)現(xiàn)就能很好地解決以上問題,其類圖如下:軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.4本章小結(jié)本章主要介紹了軟件設(shè)計(jì)模式的產(chǎn)生背景、軟件設(shè)計(jì)模式的定義與基本要素、軟件設(shè)計(jì)模式的分類,以及學(xué)習(xí)軟件設(shè)計(jì)模式的意義。另外,還介紹了后面各章節(jié)要用到的UML類之間的關(guān)系,及類圖的畫法。重點(diǎn)講解了設(shè)計(jì)模式必須遵循的面向?qū)ο蟮钠叻N設(shè)計(jì)原則。習(xí)題:見教材。軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()本章節(jié)結(jié)束,再見!軟件設(shè)計(jì)模式(Java版)、第2章創(chuàng)建型模式(上)內(nèi)容簡介?本章教學(xué)目標(biāo):

掌握單例模式與原型模式的定義與特點(diǎn)、結(jié)構(gòu)與實(shí)現(xiàn);

熟悉使用單例模式與原型模式開發(fā)應(yīng)用程序;

了解創(chuàng)建型模式的特點(diǎn)和分類與擴(kuò)展。?本章重點(diǎn)內(nèi)容:

創(chuàng)建型模式的特點(diǎn)和分類;

單例模式的定義、特點(diǎn)、結(jié)構(gòu)、實(shí)現(xiàn)與應(yīng)用場景;

原型模式的定義、特點(diǎn)、結(jié)構(gòu)、實(shí)現(xiàn)與應(yīng)用場景;

單例模式與原型模式的常見擴(kuò)展。軟件設(shè)計(jì)模式(Java版)、2.1創(chuàng)建型模式概述創(chuàng)建型模式的主要特點(diǎn)是什么?它的主要特點(diǎn)是“將對象的創(chuàng)建與使用分離”,這樣可以降低系統(tǒng)的耦合度。創(chuàng)建型模式分為以下幾種:⑴單例(Singleton)模式:某個類只能生成一個實(shí)例,該類提供了一個全局訪問點(diǎn)供外部獲取該實(shí)例,其拓展是有限多例模式。⑵原型(Prototype)模式:將一個對象作為原型,通過對其進(jìn)行復(fù)制而克隆出多個和原型類似的新實(shí)例。⑶工廠方法(FactoryMethod)模式:定義一個用于創(chuàng)建產(chǎn)品的接口,由子類決定生產(chǎn)什么產(chǎn)品。⑷抽象工廠(AbstractFactory)模式:提供一個創(chuàng)建產(chǎn)品族的接口,其每個子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品。⑸建造者(Builder)模式:將一個復(fù)雜對象分解成多個相對簡單的部分,然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對象。軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式2.2.1模式的定義與特點(diǎn)

定義:指一個類只有一個實(shí)例,且該類能自行創(chuàng)建這個實(shí)例的一種模式。例如,Windows中的任務(wù)管理器、回收站等。

特點(diǎn):1)單例類只有一個實(shí)例對象;2)該單例對象必須由單例類自行創(chuàng)建;3)單例類對外提供一個訪問該單例的全局訪問點(diǎn)。2.2.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)單例模式的主要角色有:⑴單例類:包含一個實(shí)例且能自行創(chuàng)建這個實(shí)例的類。⑵訪問者類:使用單例的類。其結(jié)構(gòu)圖如下:軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)(續(xù))

普通類的構(gòu)造函數(shù)是公有的,外部類可以通過“new構(gòu)造函數(shù)()”來生成多個實(shí)例。但是,如果將類的構(gòu)造函數(shù)設(shè)為私有的,外部類就無法調(diào)用它生成多個實(shí)例了。這時該類自身必須定義一個靜態(tài)私有實(shí)例,并向外提供一個靜態(tài)的公有函數(shù)用于創(chuàng)建或獲取該靜態(tài)私有實(shí)例,有2種常見的實(shí)現(xiàn)形式。軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式(續(xù))第1種:懶漢式單例該模式的特點(diǎn)是類加載時沒有生成單例,只有當(dāng)?shù)谝淮握{(diào)用getInstance方法時才去創(chuàng)建這個單例。代碼如下:publicclassLazySingleton{privatestaticvolatileLazySingletoninstance=null;//保證instance在所有線程中同步privateLazySingleton(){}//private避免類在外部被實(shí)例化publicstaticsynchronizedLazySingletongetInstance(){//getInstance方法前加同步if(instance==null){instance=newLazySingleton();}returninstance;}}軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式(續(xù))第2種:餓漢式單例該模式的特點(diǎn)是類一旦加載就創(chuàng)建一個單例,保證在調(diào)用getInstance方法之前單例已經(jīng)存在了。publicclassHungrySingleton{privatestaticfinalHungrySingletoninstance=newHungrySingleton();privateHungrySingleton(){}publicstaticHungrySingletongetInstance(){returninstance;}}軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.3模式的應(yīng)用實(shí)例

【例2.1】用懶漢式單例模式模擬產(chǎn)生美國當(dāng)今總統(tǒng)對象。

分析:在每一屆任期內(nèi),美國的總統(tǒng)只有一人,所以本實(shí)例適合用單例模式實(shí)現(xiàn),右邊是用懶漢式單例實(shí)現(xiàn)的結(jié)構(gòu)圖:

注:程序代碼見附件。軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.3模式的應(yīng)用實(shí)例

【例2.2】用餓漢式單例模式模擬產(chǎn)生豬八戒對象。

分析:同樣豬八戒也只有一個,所以本實(shí)例同樣適合用單例模式實(shí)現(xiàn),右邊是用餓漢式單例實(shí)現(xiàn)的結(jié)構(gòu)圖:注:程序代碼見附件。軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.3模式的應(yīng)用實(shí)例

【例2.2】用餓漢式單例模式模擬產(chǎn)生豬八戒對象。

右邊是程序的運(yùn)行結(jié)果:軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.4模式的應(yīng)用場景前面我們分析了單例模式的結(jié)構(gòu)與特點(diǎn),現(xiàn)在來看看它通常適用的以下場景的特點(diǎn):

(1)在應(yīng)用場景中,某類只要求生成一個對象的時候。如:一個班中的班長、每個人的身份證號等;(2)當(dāng)對象需要被共享的場合。由于單例模式只允許創(chuàng)建一個對象,共享該對象可以節(jié)省內(nèi)存,并加快對象訪問速度。如:WEB中的配置對象、數(shù)據(jù)庫的連接池等。(3)當(dāng)某類需要頻繁實(shí)例化,而創(chuàng)建的對象又頻繁被銷毀的時候。如:多線程的線程池、網(wǎng)絡(luò)連接池等。軟件設(shè)計(jì)模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.5模式的擴(kuò)展單例模式可擴(kuò)展為有限的多例(Multiton)模式,這種模式可生成有限個實(shí)例并保存在ArrayList中,客戶需要時可隨機(jī)獲取,其結(jié)構(gòu)圖如右:軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式2.3.1模式的定義與特點(diǎn)

定義:用一個已經(jīng)創(chuàng)建的實(shí)例作為原型,通過拷貝該原型對象來創(chuàng)建一個和原型相同或相似的新對象。在這里,原型實(shí)例指定了要創(chuàng)建的對象的種類。如:Windows中的COPY操作。

特點(diǎn):創(chuàng)建對象非常高效,根本無需知道對象創(chuàng)建的細(xì)節(jié)。2.3.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)原型模式包含以下主要角色:⑴抽象原型類:規(guī)定了具體原型對象必須實(shí)現(xiàn)的接口。⑵具體原型類:實(shí)現(xiàn)抽象原型類的clone方法,它可被復(fù)制。⑶訪問者類:使用具體原型類中的clone方法來復(fù)制新的對象。軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)(續(xù))

其結(jié)構(gòu)圖如下:軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

2.模式的實(shí)現(xiàn)原型模式的克隆分為淺克隆和深克隆,Java中的Object類提供了淺克隆的clone()方法,具體原型類只要實(shí)現(xiàn)Cloneable接口就可實(shí)現(xiàn)對象的淺克隆,這里的Cloneable接口就是抽象原型類。

//其實(shí)現(xiàn)代碼見附件軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.3模式的應(yīng)用實(shí)例

【例2.3】用原型模式模擬“孫悟空”復(fù)制自己。

分析:孫悟空拔下猴毛輕輕一吹就變出很多孫悟空,這實(shí)際上是用到了原型模式,右邊是其結(jié)構(gòu)圖:

注:程序代碼見附件軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.3模式的應(yīng)用實(shí)例

【例2.3】用原型模式模擬“孫悟空”復(fù)制自己。

//右邊是程序的運(yùn)行結(jié)果:軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.3模式的應(yīng)用實(shí)例

【例2.4】用原型模式生成“三好學(xué)生”獎狀。

分析:同一學(xué)校的“三好學(xué)生”獎狀除了獲獎人姓名不同,其他都相同,屬于相似對象的復(fù)制,同樣可以用原型模式創(chuàng)建,然后再做簡單修改就可以了,右邊是其結(jié)構(gòu)圖:

注:程序代碼見附件軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.4模式的應(yīng)用場景原型模式通常適用以下場景:1)對象之間相同或相似,即只是個別的幾個屬性不同的時候。

2)對象的創(chuàng)建過程比較麻煩,但克隆比較簡單時候。軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.5模式的擴(kuò)展原型模式可擴(kuò)展為帶原型管理器的原型模式,它在原型模式的基礎(chǔ)上增加了一個原型管理器類。該類用HashMap保存多個原型的拷貝,Client類可以通過管理器的get(Stringid)方法從中獲取原型的拷貝,其結(jié)構(gòu)圖如右:軟件設(shè)計(jì)模式(Java版)、2.3原型(Prototype)模式(續(xù))

【例2.5】用帶原型管理器的原型模式來生成包含“圓”和“正方形”等圖形的原型。

分析:本實(shí)例中由于存在不同的圖形類,如:“圓”和“正方形”,它們計(jì)算面積的方法不一樣,所以需要用一個原型管理器來管理它們,右邊是其結(jié)構(gòu)圖:

注:程序代碼見附件軟件設(shè)計(jì)模式(Java版)、2.4本章小結(jié)本章主要介紹了創(chuàng)建型模式的特點(diǎn)和分類,以及單例模式與原型模式的定義與特點(diǎn)、結(jié)構(gòu)與實(shí)現(xiàn)、應(yīng)用場景和模式的擴(kuò)展,并通過多個應(yīng)用實(shí)例來說明模式的使用方法。習(xí)題:見教材。軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()本章節(jié)結(jié)束,再見!軟件設(shè)計(jì)模式(Java版)、第3章創(chuàng)建型模式(下)內(nèi)容簡介?本章教學(xué)目標(biāo):

掌握工廠方法模式、抽象工廠模式、建造者模式的定義與特點(diǎn)、結(jié)構(gòu)與實(shí)現(xiàn);

學(xué)會使用工廠方法模式、抽象工廠模式、建造者模式開發(fā)應(yīng)用程序;

明白工廠方法模式、抽象工廠模式、建造者模式的應(yīng)用場景與擴(kuò)展方向。?本章重點(diǎn)內(nèi)容:

三種創(chuàng)建型模式的特點(diǎn)和結(jié)構(gòu);

三種創(chuàng)建型模式的實(shí)現(xiàn)方法與應(yīng)用場景;

使用這三種創(chuàng)建型模式的編程方法。軟件設(shè)計(jì)模式(Java版)、3.1工廠方法(FactoryMethod)模式3.1.1模式的定義與特點(diǎn)

定義:定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將產(chǎn)品對象的實(shí)際創(chuàng)建工作推遲到具體子工廠類當(dāng)中。這滿足創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點(diǎn)。如果要創(chuàng)建的產(chǎn)品不多,只要一個工廠類就可以完成,這種模式叫“簡單工廠模式”,它不屬于GoF的23種經(jīng)典設(shè)計(jì)模式,它的缺點(diǎn)是增加新產(chǎn)品時會違背“開閉原則”,本書不介紹。

優(yōu)點(diǎn):1)用戶知道具體工廠的名稱就可得到所要的產(chǎn)品,無須知道產(chǎn)品的創(chuàng)建過程;2)增加新的產(chǎn)品時只需要添加具體產(chǎn)品類和對應(yīng)的具體工廠類,無需修改源代碼,滿足開閉原則。缺點(diǎn):每增加一個產(chǎn)品就要增加一個具體產(chǎn)品類和一個對應(yīng)的具體工廠類,這增加了系統(tǒng)的復(fù)雜度。軟件設(shè)計(jì)模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)工廠方法模式的主要角色有:1)抽象工廠(AbstractFactory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過它訪問具體工廠的工廠方法newProduct()來創(chuàng)建產(chǎn)品。2)具體工廠(ConcreteFactory):主要是實(shí)現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。3)抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。4)具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間一一對應(yīng)。軟件設(shè)計(jì)模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)右邊是其結(jié)構(gòu)圖:

2.模式的實(shí)現(xiàn)

//該模式的實(shí)現(xiàn)代碼見附件軟件設(shè)計(jì)模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.3模式的應(yīng)用實(shí)例

【例3.1】用工廠方法模式設(shè)計(jì)畜牧場。

分析:有很多種類的畜牧場,如養(yǎng)馬場用于養(yǎng)馬,養(yǎng)牛場用于養(yǎng)牛。所以該實(shí)例用工廠方法模式比較適合,右邊是其結(jié)構(gòu)圖:

注:程序代碼見附件軟件設(shè)計(jì)模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.3模式的應(yīng)用實(shí)例

【例3.1】用工廠方法模式設(shè)計(jì)畜牧場。

右邊是程序的運(yùn)行結(jié)果軟件設(shè)計(jì)模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.4模式的應(yīng)用場景工廠方法模式通常適用以下場景:1)客戶只知道創(chuàng)建產(chǎn)品的工廠名,而不知道具體的產(chǎn)品名。如:TCL電視工廠、海信電視工廠等;2)創(chuàng)建對象的任務(wù)由多個具體子工廠中的某一個完成,而抽象工廠只提供創(chuàng)建產(chǎn)品的接口。3)客戶不關(guān)心創(chuàng)建產(chǎn)品的細(xì)節(jié),只關(guān)心產(chǎn)品的品牌。軟件設(shè)計(jì)模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.5模式的擴(kuò)展

當(dāng)需要生成的產(chǎn)品不多且不會增加,一個具體工廠類就可以完成任務(wù)時,可刪除抽象工廠類。這時工廠方法模式將退化到簡單工廠模式,其結(jié)構(gòu)圖如右:軟件設(shè)計(jì)模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式

在前面介紹的工廠方法模式只考慮生產(chǎn)同等級的產(chǎn)品,但是在現(xiàn)實(shí)生活中許多工廠是綜合型的工廠,能生產(chǎn)多等級(種類)的產(chǎn)品,如農(nóng)場里既養(yǎng)動物又種植物,電器廠既生成電視機(jī)又生成洗衣機(jī)或空調(diào),大學(xué)既有軟件專業(yè)又有生物專業(yè)等等。本節(jié)要介紹的抽象工廠模式將考慮多等級產(chǎn)品的生產(chǎn),我們將同一個具體工廠所生產(chǎn)的位于不同等級的一組產(chǎn)品稱為一個產(chǎn)品族,右圖所示的是海爾工廠和TCL工廠所生成的電視機(jī)與空調(diào)對應(yīng)的關(guān)系圖:軟件設(shè)計(jì)模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.1模式的定義與特點(diǎn)

定義:是一種為訪問類提供一個創(chuàng)建一組相關(guān)或相互依賴對象的接口,且訪問類無需指定所要產(chǎn)品的具體類就能得到同族的不同等級的產(chǎn)品的模式結(jié)構(gòu)。使用抽象工廠模式一般要滿足以下條件:1)系統(tǒng)中有多個產(chǎn)品族,每個具體工廠創(chuàng)建同一族的但屬于不同等級結(jié)構(gòu)的產(chǎn)品。

2)系統(tǒng)一次只可能消費(fèi)其中某一族產(chǎn)品,即同族的產(chǎn)品一起使用。

優(yōu)點(diǎn):1)可以在類的內(nèi)部對產(chǎn)品族中相關(guān)聯(lián)的多等級產(chǎn)品共同管理,而不必專門引入多個新的類來進(jìn)行管理;2)當(dāng)增加一個新的產(chǎn)品族時不需要修改原代碼,滿足開閉原則。缺點(diǎn):當(dāng)產(chǎn)品族中需要增加一個新等級的產(chǎn)品時,則所有的工廠類都需要進(jìn)行修改。軟件設(shè)計(jì)模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)抽象工廠模式的主要角色有:1)抽象工廠(AbstractFactory):提供了創(chuàng)建產(chǎn)品的接口,它包含多個創(chuàng)建產(chǎn)品的方法newProduct(),可以創(chuàng)建多個不同等級的產(chǎn)品。2)具體工廠(ConcreteFactory):主要是實(shí)現(xiàn)抽象工廠中的多個抽象方法,完成具體產(chǎn)品的創(chuàng)建。3)抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能,抽象工廠模式有多個抽象產(chǎn)品。4)具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間是多對一的關(guān)系。軟件設(shè)計(jì)模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)右邊是其結(jié)構(gòu)圖:

2.模式的實(shí)現(xiàn)

//該模式的實(shí)現(xiàn)代碼見附件軟件設(shè)計(jì)模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.3模式的應(yīng)用實(shí)例

【例3.2】用抽象工廠模式設(shè)計(jì)農(nóng)場類。

分析:農(nóng)場中除了像畜牧場一樣可以養(yǎng)動物,還可以培養(yǎng)植物,如養(yǎng)馬、養(yǎng)牛、種菜、種水果等,所以本實(shí)例比前面介紹的畜牧場類復(fù)雜,必須用抽象工廠模式來實(shí)現(xiàn),右邊是其結(jié)構(gòu)圖:

注:程序代碼見附件軟件設(shè)計(jì)模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.3模式的應(yīng)用實(shí)例

【例3.2】用抽象工廠模式設(shè)計(jì)農(nóng)場類。

右邊是程序的運(yùn)行結(jié)果軟件設(shè)計(jì)模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.4模式的應(yīng)用場景抽象工廠模式通常適用以下場景:1)當(dāng)需要創(chuàng)建的對象是一系列相互關(guān)聯(lián)或相互依賴的產(chǎn)品族時,如:電器工廠中的電視機(jī)、洗衣機(jī)、空調(diào)等。2)系統(tǒng)中有多個產(chǎn)品族,但每次只使用其中的某一族產(chǎn)品。如:有的粉絲只喜歡穿李寧牌的衣、褲和鞋。3)系統(tǒng)中提供了產(chǎn)品的類庫,且所有產(chǎn)品的接口相同,客戶端不依賴產(chǎn)品實(shí)例的創(chuàng)建細(xì)節(jié)和內(nèi)部結(jié)構(gòu)。軟件設(shè)計(jì)模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.5模式的擴(kuò)展抽象工廠模式的擴(kuò)展有一定的“開閉原則”傾斜性:1)當(dāng)增加一個新的產(chǎn)品族時只需增加一個新的具體工廠,不需要修改原代碼,滿足開閉原則。2)當(dāng)產(chǎn)品族中需要增加一個新種類的產(chǎn)品時,則所有的工廠類都需要進(jìn)行修改,不滿足開閉原則。另一方面,當(dāng)系統(tǒng)中只存在一個等級結(jié)構(gòu)的產(chǎn)品時,抽象工廠模式將退化到工廠方法模式。軟件設(shè)計(jì)模式(Java版)、3.3建造者(Builder)模式

在軟件開發(fā)過程中有時需要創(chuàng)建一個復(fù)雜的對象,這個復(fù)雜對象通常由多個子部件按一定的步驟組合而成。如:電腦是由CPU、主板、內(nèi)存條、硬盤、顯卡、機(jī)箱、顯示器、鍵盤、鼠標(biāo)等部件組裝而成的,采購員不可能自己去組裝電腦,而是將電腦的配置要求告訴老板,老板指揮技術(shù)人員去組裝電腦,然后再交給要買電腦的采購員。生活中這樣的例子很多,它們都是由多個部件構(gòu)成的,各個部件可以靈活選擇,但其創(chuàng)建步驟都大同小異。這類產(chǎn)品的創(chuàng)建無法用前面介紹的工廠模式描述,只有建造者模式可以很好地描述該類產(chǎn)品的創(chuàng)建。軟件設(shè)計(jì)模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.1模式的定義與特點(diǎn)

定義:指將一個復(fù)雜對象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計(jì)模式被稱為建造者模式。它是將一個復(fù)雜的對象分解為多個簡單的對象,然后一步一步構(gòu)建而成。

優(yōu)點(diǎn):1)各個具體的建造者相互獨(dú)立的,有利于系統(tǒng)的擴(kuò)展;2)客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),便于控制細(xì)節(jié)風(fēng)險。缺點(diǎn):1)產(chǎn)品的組成部分必須相同,這限制了其使用范圍;2)如果產(chǎn)品的內(nèi)部變化復(fù)雜,該模式會增加很多的建造者類。軟件設(shè)計(jì)模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)建造者模式的主要角色有:1)產(chǎn)品角色(Product):它是包含多個組成部件的復(fù)雜對象,由具體建造者來創(chuàng)建其各個組成部件。2)抽象建造者(Builder):是一個包含創(chuàng)建產(chǎn)品各個子部件的抽象方法的接口,它通常還包含一個返回復(fù)雜產(chǎn)品的方法getResult()。3)具體建造者(ConcreteBuilder):實(shí)現(xiàn)了Builder接口,完成復(fù)雜產(chǎn)品的各個部件的具體創(chuàng)建方法。

4)指揮者(Director):它調(diào)用建造者對象中的部件構(gòu)造與裝配方法完成復(fù)雜對象的創(chuàng)建,在指揮者中不涉及具體產(chǎn)品的信息。軟件設(shè)計(jì)模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)右邊是其結(jié)構(gòu)圖:

2.模式的實(shí)現(xiàn)

//該模式的實(shí)現(xiàn)代碼見下頁:軟件設(shè)計(jì)模式(Java版)、3.3建造者(Builder)模式(續(xù))其相關(guān)類的的代碼如下:1)產(chǎn)品角色:是包含多個組成部件的復(fù)雜對象。

classProduct{privateStringpartA;privateStringpartB;privateStringpartC;publicvoidsetPartA(StringpartA){ this.partA=partA;}軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()publicvoidsetPartB(StringpartB){ this.partB=partB;}publicvoidsetPartC(StringpartC){ this.partC=partC;}publicvoidshow(){//顯示產(chǎn)品的特性}}3.3建造者(Builder)模式(續(xù))2)抽象建造者:包含創(chuàng)建產(chǎn)品各個子部件的抽象方法。

abstractclassBuilder{

//創(chuàng)建產(chǎn)品對象protectedProductproduct=newProduct();publicabstractvoidbuildPartA();publicabstractvoidbuildPartB();publicabstractvoidbuildPartC();

//返回產(chǎn)品對象publicProductgetResult(){returnproduct;}}軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()3.3建造者(Builder)模式(續(xù))3)具體建造者:實(shí)現(xiàn)了抽象建造者接口。

publicclassConcreteBuilderextendsBuilder{publicvoidbuildPartA(){product.setPartA("建造PartA");}publicvoidbuildPartB(){product.setPartA("建造PartB");}publicvoidbuildPartC(){product.setPartA("建造PartC");}}軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()3.3建造者(Builder)模式(續(xù))4)指揮者:調(diào)用建造者中的方法完成復(fù)雜對象的創(chuàng)建。classDirector{privateBuilderbuilder;publicDirector(Builderbuilder){this.builder=builder;}publicProductconstruct(){//產(chǎn)品構(gòu)建與組裝方法builder.buildPartA();builder.buildPartB();builder.buildPartC();returnbuilder.getResult();}}軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()3.3建造者(Builder)模式(續(xù))5)客戶類

publicclassClient{publicstaticvoidmain(String[]args){Builderbuilder=newConcreteBuilder();Directordirector=newDirector(builder);Productproduct=director.construct();product.show();}}軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()3.3建造者(Builder)模式(續(xù))3.3.3模式的應(yīng)用實(shí)例

【例3.3】用建造者模式描述客廳裝修。

分析:客廳裝修是一個復(fù)雜的過程,它包含墻體的裝修、電視機(jī)的選擇、沙發(fā)的購買與布局等等。客戶把裝修要求告訴項(xiàng)目經(jīng)理,項(xiàng)目經(jīng)理指揮裝修工人一步步裝修,最后完成整個客廳的裝修與布局,所以本實(shí)例用建造者模式實(shí)現(xiàn)比較適合,右邊是其結(jié)構(gòu)圖:

注:程序代碼見附件軟件設(shè)計(jì)模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.3模式的應(yīng)用實(shí)例

【例3.3】用建造者模式描述客廳裝修。

右邊是程序的運(yùn)行結(jié)果軟件設(shè)計(jì)模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.4模式的應(yīng)用場景建造者模式創(chuàng)建的是復(fù)雜對象,其產(chǎn)品的各個部分經(jīng)常面臨著劇烈的變化,但將它們組合在一起的算法卻相對穩(wěn)定,所以它通常在以下場合使用:1)創(chuàng)建的對象較復(fù)雜,由多個部件構(gòu)成,各部件面臨著復(fù)雜的變化,但構(gòu)件間的建造順序是穩(wěn)定的。

2)創(chuàng)建復(fù)雜對象的算法獨(dú)立于該對象的組成部分以及它們的裝配方式,即產(chǎn)品的構(gòu)建過程和最終的表示是獨(dú)立的。軟件設(shè)計(jì)模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.5模式的擴(kuò)展建造者模式在應(yīng)用過程中可以根據(jù)需要改變,如果創(chuàng)建的產(chǎn)品種類只有一種,只需要一個具體的建造者,這時可以省略掉抽象建造者,甚至可以省略掉指導(dǎo)者角色。軟件設(shè)計(jì)模式(Java版)、3.4本章小結(jié)本章主要介紹了工廠方法模式、抽象工廠模式、建造者模式等三種創(chuàng)建型模式的定義、特點(diǎn)、結(jié)構(gòu)與實(shí)現(xiàn),并通過應(yīng)用實(shí)例介紹了這三種創(chuàng)建型模式的實(shí)現(xiàn)方法,最后分析了它們的應(yīng)用場景和擴(kuò)展方向。習(xí)題:見教材。軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()本章節(jié)結(jié)束,再見!軟件設(shè)計(jì)模式(Java版)、第4章結(jié)構(gòu)型模式(上)內(nèi)容簡介?本章教學(xué)目標(biāo):

了解結(jié)構(gòu)型模式的特點(diǎn)與分類;

理解代理模式、適配器模式、橋接模式的定義與特點(diǎn);

掌握代理模式、適配器模式、橋接模式的結(jié)構(gòu)與實(shí)現(xiàn);學(xué)會使用這三種設(shè)計(jì)模式開發(fā)應(yīng)用程序;明白這三種設(shè)計(jì)模式的擴(kuò)展應(yīng)用。?本章重點(diǎn)內(nèi)容:

結(jié)構(gòu)型模式的定義、特點(diǎn)和分類方法;

代理模式的特點(diǎn)、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法;

適配器模式的特點(diǎn)、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法;

橋接模式的特點(diǎn)、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法。軟件設(shè)計(jì)模式(Java版)、4.1結(jié)構(gòu)型模式概述結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)。它分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式,前者采用繼承機(jī)制來組織接口和類,后者采用組合或聚合來組合對象。由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復(fù)用原則”,所以對象結(jié)構(gòu)型模式比類結(jié)構(gòu)型模式具有更大的靈活性。結(jié)構(gòu)型模式分為以下7種:⑴代理(Proxy)模式:為某對象提供一種代理以控制對該對象的訪問。即客戶端通過代理間接地訪問該對象,從而限制、增強(qiáng)或修改該對象的一些特性。⑵適配器(Adapter)模式:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。⑶橋接(Bridge)模式:將抽象與實(shí)現(xiàn)分離,使他們可以獨(dú)立的變化。它是用組合關(guān)系代替繼承關(guān)系來實(shí)現(xiàn),從而降低了抽象和實(shí)現(xiàn)這2個可變維度的耦合度。軟件設(shè)計(jì)模式(Java版)、4.1結(jié)構(gòu)型模式概述(續(xù))

⑷裝飾(Decorator)模式:動態(tài)的給對象增加一些職責(zé),即增加其額外的功能。⑸外觀(Facade)模式:為多個復(fù)雜的子系統(tǒng)提供一個一致的接口,使這些子系統(tǒng)更加容易被訪問。⑹享元(Flyweight)模式:運(yùn)用共享技術(shù)來有效地支持大量細(xì)粒度對象的復(fù)用。⑺組合(Composite)模式:將對象組合成樹狀層次結(jié)構(gòu),使用戶對單個對象和組合對象具有一致的訪問性。以上7種結(jié)構(gòu)型模式,除了適配器模式分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式2種,其他的全部屬于對象結(jié)構(gòu)型模式。軟件設(shè)計(jì)模式(Java版)(ISDN:9787564740634)、人民郵電出版社()4.2代理(Proxy)模式4.2.1模式的定義與特點(diǎn)

定義:由于某些原因需要給某對象提供一個代理以控制對該對象的訪問。這時,訪問對象不適合或者不能直接引用目標(biāo)對象,代理對象作為訪問對象和目標(biāo)對象之間的中介。

優(yōu)點(diǎn):1)代理模式在客戶端與目標(biāo)對象之間起到一個中介作用和保護(hù)目標(biāo)對象的作用;2)代理對象可以擴(kuò)展目標(biāo)對象的功能;3)代理模式能將客戶端與目標(biāo)對象分離,在一定程度上降低了系統(tǒng)的耦合度。缺點(diǎn):1)在客戶端和目標(biāo)對象增加一個代理對象,會造成請求處理速度變慢;2)增加了系統(tǒng)的復(fù)雜度。軟件設(shè)計(jì)模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)代理模式的主要角色有:⑴抽象主題(Subject)類:通過接口或抽象類聲明真實(shí)主題和代理對象實(shí)現(xiàn)的業(yè)務(wù)方法。⑵真實(shí)主題(RealSubject)類:實(shí)現(xiàn)了抽象主題中的具體業(yè)務(wù),是代理對象所代表的真實(shí)對象,是我們最終要引用的對象。⑶代理(Proxy)類:提供了與真實(shí)主題相同的接口,其內(nèi)部含有對真實(shí)主題的引用,它可以訪問或控制或擴(kuò)展真實(shí)主題的功能。其結(jié)構(gòu)圖如下:軟件設(shè)計(jì)模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)(續(xù)):

結(jié)構(gòu)圖如右:

2.模式的實(shí)現(xiàn)

//實(shí)現(xiàn)代碼見附件軟件設(shè)計(jì)模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.3模式的應(yīng)用實(shí)例

【例4.1】韶關(guān)“天街e角”公司是一家婺源特產(chǎn)公司的代售公司,用代理模式實(shí)現(xiàn)之。

分析:本例中的“婺源特產(chǎn)公司”經(jīng)營婺源特產(chǎn),它是真實(shí)主題;而韶關(guān)“天街e角”公司是婺源公司的代理,它可以調(diào)用婺源公司的相關(guān)方法,而且它可以增加一些額外的處理,如包裝或加價等;客戶端通過“天街e角”公司間接訪問“婺源公司”的產(chǎn)品,右邊是其結(jié)構(gòu)圖:

注:程序代碼見附件。軟件設(shè)計(jì)模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.3模式的應(yīng)用實(shí)例

【例4.1】韶關(guān)“天街e角”公司是一家婺源特產(chǎn)公司的代售公司,用代理模式實(shí)現(xiàn)之。

右邊是程序的運(yùn)行結(jié)果:軟件設(shè)計(jì)模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.4模式的應(yīng)用場景1)遠(yuǎn)程代理,這種方式通常是為了隱藏目標(biāo)對象存在于不同地址空間的事實(shí),方便客戶端訪問。例如用戶申請某些網(wǎng)盤空間時,會在用戶的文件系統(tǒng)中建立一個虛擬的硬盤,用戶訪問它實(shí)際訪問的是網(wǎng)盤空間。2)虛擬代理,這種方式通常用于要創(chuàng)建的目標(biāo)對象開銷很大時。比如下載一幅很大的圖像需要很長時間,因某種計(jì)算比較復(fù)雜而短時間無法完成,這時可以先用小比例的虛擬代理替換真實(shí)的對象,消除用戶對服務(wù)器慢的感覺。3)安全代理,這種方式通常用于控制不同種類客戶對真實(shí)對象的訪問權(quán)限。4)智能指引,主要用于當(dāng)調(diào)用目標(biāo)對象時,代理附加一些額外的處理功能。比如增加計(jì)算真實(shí)對象的引用次數(shù)的功能,這樣當(dāng)該對象沒有引用時,就可以自動釋放它。

5)延遲加載,指為了提高系統(tǒng)的性能,延遲對目標(biāo)的加載。例如,Hibernate中就存在屬性的延遲加載和關(guān)聯(lián)表的延時加載。軟件設(shè)計(jì)模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.5模式的擴(kuò)展前面介紹是靜態(tài)代理模式,存在兩個缺點(diǎn):1)真實(shí)主題與代理主題一一對應(yīng),增加真實(shí)主題也要增加代理;2)設(shè)計(jì)代理以前真實(shí)主題必須事先存在,不太靈活。而采用動態(tài)代理模式可以解決以上問題,其結(jié)構(gòu)圖如右:軟件設(shè)計(jì)模式(Java版)、4.3適配器(Adapter)模式4.3.1模式的定義與特點(diǎn)

定義:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。適配器模式分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式2種。

優(yōu)點(diǎn):

1)客戶端通過適配器可以透明地調(diào)用目標(biāo)接口;2)程序員不需要修改原有代碼而重用現(xiàn)有的適配者類;3)將目標(biāo)類和適配者類解耦,解決了目標(biāo)類和適配者類接口不一致的問題。

缺點(diǎn):對于類適配器來說,更換適配器的實(shí)現(xiàn)過程比較復(fù)雜。軟件設(shè)計(jì)模式(Java版)、4.3適配器(Adapter)模式(續(xù))4.3.2模式的結(jié)構(gòu)與實(shí)現(xiàn)

1.模式的結(jié)構(gòu)適配器模式包含以下主要角色:⑴目標(biāo)(Target)接口:當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口,它可以是抽象類或接口。⑵適配者(Adaptee)類:是被訪問和適配的現(xiàn)存組件庫中的組件接口。⑶適配器(Adapter)類:它一個轉(zhuǎn)換器,通過繼承或引用適配者的對象,把適配者接口轉(zhuǎn)換成目標(biāo)接口,讓客戶按目標(biāo)接口的格式訪問適配者。適配器模式分為:類適配器模式和對象適配器模式2種。軟件設(shè)計(jì)模式(Java版)、4.3適配器(Adapter)模式(續(xù))a.類適配器模式:其實(shí)現(xiàn)代碼見

溫馨提示

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

最新文檔

評論

0/150

提交評論