版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第1章軟件設(shè)計模式基礎(chǔ)內(nèi)容簡介?本章教學目標:
了解軟件設(shè)計模式的產(chǎn)生背景;
掌握軟件設(shè)計模式的概念、意義和基本要素;
明白GoF的23種設(shè)計模式的分類與特點;
理解UML類之間的關(guān)系,并學會類圖的畫法;
正確理解面向?qū)ο蟮钠叻N設(shè)計原則。?本章重點內(nèi)容:
GoF的23種設(shè)計模式的分類與特點;
UML中的類之間的關(guān)系;
UML中的類圖的畫法;
面向?qū)ο蟮钠叻N設(shè)計原則。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述1.1.1軟件設(shè)計模式的產(chǎn)生背景
“設(shè)計模式”這個術(shù)語最初并不是出現(xiàn)在軟件設(shè)計中,而是被用于建筑領(lǐng)域的設(shè)計中。1977年,美國著名建筑大師、加利福尼亞大學伯克利分校環(huán)境結(jié)構(gòu)中心主任ChristopherAlexander(克里斯托弗?亞歷山大)在他的著作《建筑模式語言:城鎮(zhèn)、建筑、構(gòu)造》中描述了一些常見的建筑設(shè)計問題,并提出了253種關(guān)于城鎮(zhèn)、鄰里、住宅、花園和房間等進行設(shè)計的基本模式。
1987年,肯特·貝克和沃德·坎寧安首先將克里斯托佛·亞歷山大的模式思想應(yīng)用在Smalltalk中的圖形用戶接口的生成中。直到1990年,軟件工程界才開始研討設(shè)計模式的話題,后來召開了多次關(guān)于設(shè)計模式的研討會。直到1995年,ErichGamma,RichardHelm,RalphJohnson,JohnVlissides等四位作者合作出版了《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書,在此書中共收錄了23個設(shè)計模式,這是設(shè)計模式領(lǐng)域里程碑的事件,導(dǎo)致了軟件設(shè)計模式的突破。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.2軟件設(shè)計模式的概念與意義
1.什么是軟件設(shè)計模式?軟件設(shè)計模式(SoftwareDesignpattern),又稱設(shè)計模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。
2.學習設(shè)計模式的意義⑴可以提高程序員的思維能力、編程能力和設(shè)計能力。⑵使程序設(shè)計更加標準化、代碼編制更加工程化,使軟件開發(fā)效率大大提高,從而縮短軟件的開發(fā)周期。⑶使設(shè)計的代碼可重用性高、可讀性強、可靠性高、靈活性好、可維護性強。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.3軟件設(shè)計模式的基本要素
其基本要素有:模式名稱、別名、動機、問題、解決方案、效果、結(jié)構(gòu)、模式角色、合作關(guān)系、實現(xiàn)方法、適用性、已知應(yīng)用、例程、模式擴展和相關(guān)模式等,其中最關(guān)鍵的元素包括以下四個主要部分:
1.模式名稱(PatternName)2.問題(Problem)3.解決方案(Solution)4.效果(Consequence)軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介設(shè)計模式有兩種分類方法,即:根據(jù)目的分和根據(jù)作用的范圍分。
1.根據(jù)目的來分⑴創(chuàng)建型模式:用于描述“怎樣創(chuàng)建對象”,它的主要特點是“將對象的創(chuàng)建與使用分離”。GoF中提供了5種創(chuàng)建型模式。⑵結(jié)構(gòu)型模式:用于描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu),GoF中提供了7種結(jié)構(gòu)型模式。⑶行為型模式:用于描述類或?qū)ο笾g怎樣相互協(xié)作共同完成單個對象都無法單獨完成的任務(wù),以及怎樣分配職責。GoF中提供了11種行為型模式。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介(續(xù))
1.根據(jù)作用范圍來分⑴類模式:用于處理類與子類之間的繼承關(guān)系,這些關(guān)系是靜態(tài)的。⑵對象模式:用于處理對象之間的組合或聚合關(guān)系,具動態(tài)性。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介(續(xù))
3.GoF的23種設(shè)計模式的功能?單例(Singleton)模式:某個類只能生成一個實例,該類提供了一個全局訪問點供外部獲取該實例,其拓展是有限多例模式。?原型(Prototype)模式:將一個對象作為原型,通過對其進行復(fù)制而克隆出多個和原型類似的新實例。?工廠方法(FactoryMethod)模式:定義一個用于創(chuàng)建產(chǎn)品的接口,由子類決定生產(chǎn)什么產(chǎn)品。?抽象工廠(AbstractFactory)模式:提供一個創(chuàng)建產(chǎn)品族的接口,其每個子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介(續(xù))
3.GoF的23種設(shè)計模式的功能(續(xù))?建造者(Builder)模式:將一個復(fù)雜對象分解成多個相對簡單的部分,然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對象。?代理(Proxy)模式:為某對象提供一種代理以控制對該對象的訪問。即客戶端通過代理間接地訪問該對象,從而限制、增強或修改該對象的一些特性。?適配器(Adapter)模式:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介(續(xù))
3.GoF的23種設(shè)計模式的功能(續(xù))?橋接(Bridge)模式:將抽象與實現(xiàn)分離,使他們可以獨立的變化。它是用組合關(guān)系代替繼承關(guān)系來實現(xiàn),從而降低了抽象和實現(xiàn)這2個可變維度的耦合度。?裝飾(Decorator)模式:動態(tài)的給對象增加一些職責,即增加其額外的功能。?外觀(Facade)模式:為多個復(fù)雜的子系統(tǒng)提供一個一致的接口,使這些子系統(tǒng)更加容易被訪問。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介(續(xù))
3.GoF的23種設(shè)計模式的功能(續(xù))?享元(Flyweight)模式:運用共享技術(shù)來有效地支持大量細粒度對象的復(fù)用。?組合(Composite)模式:將對象組合成樹狀層次結(jié)構(gòu),使用戶對單個對象和組合對象具有一致的訪問性。?模板方法(TemplateMethod)模式:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介(續(xù))
3.GoF的23種設(shè)計模式的功能(續(xù))?策略(Strategy)模式:定義了一系列算法,并將每個算法封裝起來,使他們可以相互替換,且算法的改變不會影響到使用算法的客戶。?命令(Command)模式:將一個請求封裝為一個對象,使發(fā)出請求的責任和執(zhí)行請求的責任分割開。?職責鏈(ChainofResponsibility)模式:把請求從鏈中的一個對象傳到下一個對象,直到請求被響應(yīng)為止。通過這種方式去除對象之間的耦合。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介(續(xù))
3.GoF的23種設(shè)計模式的功能(續(xù))?狀態(tài)(State)模式:允許一個對象在其內(nèi)部狀態(tài)發(fā)生改變時改變其行為能力。?觀察者(Observer)模式:多個對象間存在一對多關(guān)系,當一個對象發(fā)生改變時,把這種改變通知給其它多個對象,從而影響其它對象的行為。?中介者(Mediator)模式:定義一個中介對象來簡化原有對象之間的交互關(guān)系,降低系統(tǒng)中對象間的耦合度,使原有對象之間不必相互了解。軟件設(shè)計模式(Java版)、1.1軟件設(shè)計模式概述(續(xù))1.1.4GoF的23種設(shè)計模式簡介(續(xù))
3.GoF的23種設(shè)計模式的功能(續(xù))?迭代器(Iterator)模式:提供一種方法來順序訪問聚合對象中的一系列數(shù)據(jù),而不暴露聚合對象的內(nèi)部表示。?訪問者(Visitor)模式:在不改變集合元素的前提下,為一個集合中的每個元素提供多種訪問方式,即每個元素有多個訪問者對象訪問。?備忘錄(Memento)模式:在不破壞封裝性的前提下,獲取并保存一個對象的內(nèi)部狀態(tài),以便以后恢復(fù)它。?解釋器(Interpreter)模式:提供如何定義語言的文法,以及對語言句子的解釋方法,即解釋器。軟件設(shè)計模式(Java版)、1.2UML中的類圖1.2.1統(tǒng)一建模語言簡介
?統(tǒng)一建模語言(UnifiedModelingLanguage,簡稱:UML):是用來設(shè)計軟件藍圖的可視化建模語言,1997年被國際對象組織OMG采納為為面向?qū)ο蟮慕UZ言的國際標準。?它的特點:是簡單、統(tǒng)一、圖形化、能表達軟件設(shè)計中的動態(tài)與靜態(tài)信息。?UML從目標系統(tǒng)的不同角度出發(fā),定義了:用例圖、類圖、對象圖、狀態(tài)圖、活動圖、序列圖、協(xié)作圖、構(gòu)件圖、部署圖等9種圖。注:本教材主要介紹軟件設(shè)計模式中經(jīng)常用到的類圖,以及類之間的關(guān)系。軟件設(shè)計模式(Java版)、1.2UML中的類圖(續(xù))1.2.2類、接口和類圖
1.類(Class)類是指具有相同屬性、方法和關(guān)系的對象的抽象,它具有封裝性、繼承性和多態(tài)性等三大特性。在UML中類包含:⑴類名(Name)是一個字符串,如:Student。⑵屬性(Attribute)是指類的特性,即類的成員變量。格式:
[可見性]屬性名:類型[=缺省值]注意:“可見性”表示該屬性對于類外的元素而言是否可見,在類圖中分別用符號+、-、#、~表示。如:-name:String⑶操作(Operations)是類的成員方法。格式:
[可見性]名稱(參數(shù)列表)[:返回類型]軟件設(shè)計模式(Java版)、1.2UML中的類圖(續(xù))下圖是學生類的UML表示:軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.2UML中的類圖(續(xù))1.2.2類、接口和類圖
2.接口(Interface)接口是一種特殊的類,它包含抽象操作,但不包含屬性。它描述了類或組件對外可見的動作。下圖是圖形類接口的UML表示:軟件設(shè)計模式(Java版)、1.2UML中的類圖(續(xù))1.2.2類、接口和類圖
3.類圖(ClassDiagram)類圖是用來顯示系統(tǒng)中的類、接口、協(xié)作以及它們之間的靜態(tài)結(jié)構(gòu)和關(guān)系的一種靜態(tài)模型。右邊是“計算長方形和圓形的周長與面積”的類圖:軟件設(shè)計模式(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)用來訪問另一個類(被依賴類)中的某些方法來完成一些職責。軟件設(shè)計模式(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)系,如老師和學生、師傅和徒弟、丈夫和妻子等。關(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è)計模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系
3.聚合(Aggregation)關(guān)系聚合關(guān)系是強關(guān)聯(lián)關(guān)系,是整體和部分之間的關(guān)系,是has-a的關(guān)系。聚合關(guān)系也是通過成員對象來實現(xiàn)的,其中成員對象是整體對象的一部分,但是成員對象可以脫離整體對象而獨立存在。例如,學校與老師的關(guān)系,學校包含老師,但如果學校停辦了,老師依然存在。軟件設(shè)計模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系
4.組合(Composition)關(guān)系組合關(guān)系也表示類之間的整體與部分的關(guān)系,但它是一種更強烈的聚合關(guān)系,是contains-a關(guān)系。整體對象可以控制部分對象的生命周期,一旦整體對象不存在,部分對象也將不存在,部分對象不能脫離整體對象而存在。例如,頭和嘴的關(guān)系,沒有了頭,嘴也就不存在了。軟件設(shè)計模式(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è)計模式(Java版)、1.2UML中的類圖(續(xù))1.2.3類之間的關(guān)系
6.實現(xiàn)(Realization)關(guān)系實現(xiàn)關(guān)系是接口與實現(xiàn)類之間的關(guān)系。在UML類圖中,實現(xiàn)關(guān)系使用帶空心三角箭頭的虛線來表示,箭頭從實現(xiàn)類指向接口。例如,汽車和船實現(xiàn)了交通工具,其類圖如下:軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則1.3.1開閉原則
1.開閉原則的定義開閉原則(OCP):軟件實體應(yīng)當對擴展開放,對修改關(guān)閉。勃蘭特·梅耶(BertrandMeyer)在1988年的著作《面向?qū)ο筌浖?gòu)造》中提出,這里的軟件實體包括以下幾個部分:1)項目中劃分出的模塊;2)類與接口;3)方法。
2.開閉原則的重要性⑴對軟件測試的影響,軟件測試時只需要對擴展的代碼進行測試就。⑵可以提高代碼的可復(fù)用性。⑶可以提高軟件的可維護性,易于擴展和維護。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))3.開閉原則的實現(xiàn)方法可以通過“抽象約束、封裝變化”來實現(xiàn)開閉原則,即通過接口或者抽象類為軟件實體定義一個相對穩(wěn)定的抽象層,而將相同的可變因素封裝在相同的具體實現(xiàn)類中。
【例1.1】Windows的桌面主題設(shè)計。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))1.3.2里氏替換原則
1.里氏替換原則的定義里氏替換原則(LSP):繼承必須確保超類所擁有的性質(zhì)在子類中仍然成立。由麻省理工學院計算機科學實驗室的Liskov女士在1987年的OOPSLA(面向?qū)ο蠹夹g(shù)的高峰會議)上發(fā)表的一篇文章《數(shù)據(jù)抽象和層次》里面提出來的。
2.里氏替換原則的重要性⑴里氏替換原則是實現(xiàn)開閉原則的重要方式之一。⑵它克服了繼承中重寫父類造成的可復(fù)用性變差的缺點。⑶它是動作正確性的保證。即類的擴展不會給已有的系統(tǒng)引入新的錯誤,降低了代碼出錯的可能性。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))3.里氏替換原則的實現(xiàn)方法
子類可以擴展父類的功能,但不能改變父類原有的功能。
【例1.2】里氏替換原則在“幾維鳥不是鳥”實例中的應(yīng)用。
分析:鳥一般都會飛行,如燕子的飛行速度大概是每小時可達120公里。但是新西蘭的“幾維鳥”,由于翅膀退化,因此無法飛行。//程序代碼見附件軟件設(shè)計模式(Java版)、說明:以上類圖違背了“里氏替換原則”,要改。1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))以上程序運行錯誤的原因是:幾維鳥類重寫了鳥類的setSpeed(doublespeed)方法,這違背了里氏替換原則。正確的做法是:取消幾維鳥原來的繼承關(guān)系,定義鳥和幾維鳥的更一般的父類,如動物類,它們都有奔跑的能力。右邊是其類圖:軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))1.3.3依賴倒置原則
1.依賴倒置原則的定義依賴倒置原則(DIP)的含義是:高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細節(jié),細節(jié)應(yīng)該依賴抽象。其核心思想是:要面向接口編程,不要面向?qū)崿F(xiàn)編程。是ObjectMentor公司總裁RobertC.Martin于1996年在C++Report上發(fā)表的文章中提出的。
2.依賴倒置原則的重要性⑴依賴倒置原則可以降低類間的耦合性。⑵依賴倒置原則可以提高系統(tǒng)的穩(wěn)定性。⑶依賴倒置原則可以減少并行開發(fā)引起的風險。⑷依賴倒置原則可以提高代碼的可讀性和可維護性。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))3.依賴倒置原則的實現(xiàn)方法我們在實際編程中只要遵循以下四點,就能在項目中滿足這個規(guī)則:
⑴每個類盡量提供接口或抽象類,或者兩者都具備。⑵變量的聲明類型盡量是接口或者是抽象類。⑶任何類都不應(yīng)該從具體類派生。⑷使用繼承時盡量遵循里氏替換原則。
【例1.3】依賴倒置原則在“顧客購物程序”中的應(yīng)用。
分析:如顧客類的shopping(ShaoguanShopshop)方法只訪問韶關(guān)網(wǎng)店,如果該顧客想從另外一家商店(如:婺源網(wǎng)店WuyuanShop)購物,就要修改該方法的參數(shù)類型,這違背了“依賴倒置”原則。解決方法是:定義一個商店接口Shop,顧客類面向該接口編程,其類圖如下。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))下面是顧客購物程序的類圖,其程序源代碼見附件。軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))1.3.4單一職責原則
1.單一職責原則的定義單一職責原則(SRP)規(guī)定一個類應(yīng)該有且僅有一個引起它變化的原因,否則類應(yīng)該被拆分。由羅伯特·C·馬丁(RobertC.Martin)于《敏捷軟件開發(fā):原則、模式和實踐》一書中給出的。
2.單一職責原則的重要性⑴降低類的復(fù)雜度。⑵提高類的可讀性。復(fù)雜性降低,自然其可讀性會提高。⑶提高系統(tǒng)的可維護性。可讀性提高,那自然更容易維護了。⑷變更引起的風險降低。變更是必然的,如果單一職責原則遵守得好,當修改一個功能時,可以顯著降低對其他功能的影響。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))3.單一職責原則的實現(xiàn)方法單一職責原則是最簡單但又最難運用的原則,需要設(shè)計人員發(fā)現(xiàn)類的不同職責并將其分離,再封裝到不同的類或模塊中。而發(fā)現(xiàn)類的多重職責需要設(shè)計人員具有較強的分析設(shè)計能力和相關(guān)重構(gòu)經(jīng)驗。
【例1.4】大學學生工作管理程序。
分析:大學學生工作主要包括學生生活輔導(dǎo)和學生學業(yè)指導(dǎo)兩個方面的工作,其中生活輔導(dǎo)主要包括班委建設(shè)、出勤統(tǒng)計、心理輔導(dǎo)、費用催繳、班級管理等工作,學業(yè)指導(dǎo)主要包括專業(yè)引導(dǎo)、學習輔導(dǎo)、科研指導(dǎo)、學習總結(jié)等工作。如果將這些工作交給一位老師負責顯然不合理,正確的做法是生活輔導(dǎo)由輔導(dǎo)員負責,學業(yè)指導(dǎo)由學業(yè)導(dǎo)師負責,其類圖如下。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))大學學生工作管理程序的類圖如下:軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))1.3.5接口隔離原則
1.接口隔離原則的定義接口隔離原則(ISP)含義是:客戶端不應(yīng)該被迫依賴于它不使用的方法。2002年羅伯特·C·馬丁在《敏捷軟件開發(fā):原則、模式和實踐》一書中提出,它要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感興趣的方法。
2.接口隔離原則的重要性⑴將臃腫龐大的接口分解,可以預(yù)防外來變更的擴散。⑵接口隔離提高了系統(tǒng)的內(nèi)聚性,減少了對外交互。⑶如果接口的粒度大小定義合理,能夠保證系統(tǒng)的穩(wěn)定性。⑷使用多個專門的接口還能夠體現(xiàn)對象的層次。⑸能減少項目工程中的代碼冗余。過大的接口里面通常放置許多不用的方法。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))3.接口隔離原則的實現(xiàn)方法在具體應(yīng)用接口隔離原則時,應(yīng)該根據(jù)以下幾個規(guī)則來衡量:
⑴接口盡量小,但是要有限度。⑵只提供調(diào)用者需要的方法,屏蔽不需要的方法。⑶了解環(huán)境,拒絕盲從。⑷提高內(nèi)聚,減少對外交互。
【例1.5】學生成績管理程序。
分析:學生成績管理程序一般包含插入成績、刪除成績、修改成績、計算總分、計算均分、打印成績信息、查詢成績信息等功能,如果將這些功能全部放到一個接口中顯然不太合理,正確的做法是將它們分別放在輸入模塊、統(tǒng)計模塊和打印模塊等3個模塊中,其類圖如下。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))3.接口隔離原則的實現(xiàn)方法右邊是學生成績管理程序的類圖://其程序代碼見附件軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))1.3.6迪米特法則
1.迪米特法則的定義迪米特法則(LoD)又叫作最少知識原則(LKP),其定義是:只與你的直接朋友交談,不跟“陌生人”說話。1987年美國東北大學的IanHolland提出,后來又因為在經(jīng)典著作《程序員修煉之道》而廣為人知。迪米特法則中的“朋友”是指:當前對象本身、當前對象的成員對象、當前對象所創(chuàng)建的對象、當前對象的方法參數(shù)等,這些對象同當前對象存在關(guān)聯(lián)、聚合或組合關(guān)系,可以直接訪問這些對象的方法。
2.迪米特法則的重要性⑴降低了類之間的耦合度,提高了模塊的相對獨立性。⑵由于耦合度降低,從而提高了類的可復(fù)用率和系統(tǒng)的擴展性。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))3.迪米特法則的實現(xiàn)方法在運用迪米特法則時要注意以下六點:
⑴在類的劃分上,應(yīng)該創(chuàng)建弱耦合的類。⑵在類的結(jié)構(gòu)設(shè)計上,盡量降低類成員的訪問權(quán)限。⑶在類的設(shè)計上,優(yōu)先考慮將一個類設(shè)置成不變類。⑷在對其他類的引用上,將引用其它對象的次數(shù)降到最低。⑸不暴露類的屬性成員,而應(yīng)該提供相應(yīng)的訪問器(set和get方法)。⑹謹慎使用序列化(Serializable)功能。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))
【例1.6】明星與經(jīng)紀人的關(guān)系實例。
分析:明星由于全身心投入藝術(shù),所以許多日常事務(wù)由經(jīng)紀人負責處理,如:與粉絲的見面會,與媒體公司的業(yè)務(wù)洽淡等。這里的經(jīng)紀人是明星的朋友,而粉絲和媒體公司是陌生人,所以適合使用迪米特法則,右邊是其類圖:軟件設(shè)計模式(Java版)、//其程序代碼見附件1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))1.3.7合成復(fù)用原則
1.合成復(fù)用原則的定義合成復(fù)用原則(CRP)又叫組合/聚合復(fù)用原則(CARP)。它要求在軟件復(fù)用時,要盡量先使用組合或者聚合等關(guān)聯(lián)關(guān)系來實現(xiàn),其次才考慮使用繼承關(guān)系來實現(xiàn)。如果要使用繼承關(guān)系,則必須遵循里氏代換原則。
2.合成復(fù)用原則的重要性⑴它維持了類的封裝性。因為成分對象的內(nèi)部細節(jié)是新對象看不見的,所以這種復(fù)用又稱為“黑箱”復(fù)用;⑵新舊類之間的耦合度低。這種復(fù)用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口;⑶復(fù)用的靈活性高。這種復(fù)用可以在運行時動態(tài)進行,新對象可以動態(tài)地引用與成分對象類型相同的對象。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))3.合成復(fù)用原則的實現(xiàn)方法合成復(fù)用原則是通過將已有的對象納入到新對象中,作為新對象的成員對象來實現(xiàn)的,新對象可以調(diào)用已有對象的功能,從而達到復(fù)用。下面以汽車分類管理程序為例來介紹合成復(fù)用原則的應(yīng)用。
【例1.7】汽車分類管理程序。
分析:汽車按“動力源”劃分可分為汽油汽車、電動汽車等,按“顏色”劃分可分為白色汽車、黑色汽車和紅色汽車等,如果同時考慮這兩種分類,其組合就很多。軟件設(shè)計模式(Java版)、1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))以下是用繼承關(guān)系實現(xiàn)的汽車分類的類圖:軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.3面向?qū)ο蟮脑O(shè)計原則(續(xù))可能看出可以看出用繼承關(guān)系實現(xiàn)會產(chǎn)生很多子類,而且增加新的“動力源”或者增加新的“顏色”都要修改源代碼,這違背了“開-閉”原則,顯然不可取。但如果改用組合關(guān)系實現(xiàn)就能很好地解決以上問題,其類圖如下:軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()1.4本章小結(jié)本章主要介紹了軟件設(shè)計模式的產(chǎn)生背景、軟件設(shè)計模式的定義與基本要素、軟件設(shè)計模式的分類,以及學習軟件設(shè)計模式的意義。另外,還介紹了后面各章節(jié)要用到的UML類之間的關(guān)系,及類圖的畫法。重點講解了設(shè)計模式必須遵循的面向?qū)ο蟮钠叻N設(shè)計原則。習題:見教材。軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()本章節(jié)結(jié)束,再見!軟件設(shè)計模式(Java版)、第2章創(chuàng)建型模式(上)內(nèi)容簡介?本章教學目標:
掌握單例模式與原型模式的定義與特點、結(jié)構(gòu)與實現(xiàn);
熟悉使用單例模式與原型模式開發(fā)應(yīng)用程序;
了解創(chuàng)建型模式的特點和分類與擴展。?本章重點內(nèi)容:
創(chuàng)建型模式的特點和分類;
單例模式的定義、特點、結(jié)構(gòu)、實現(xiàn)與應(yīng)用場景;
原型模式的定義、特點、結(jié)構(gòu)、實現(xiàn)與應(yīng)用場景;
單例模式與原型模式的常見擴展。軟件設(shè)計模式(Java版)、2.1創(chuàng)建型模式概述創(chuàng)建型模式的主要特點是什么?它的主要特點是“將對象的創(chuàng)建與使用分離”,這樣可以降低系統(tǒng)的耦合度。創(chuàng)建型模式分為以下幾種:⑴單例(Singleton)模式:某個類只能生成一個實例,該類提供了一個全局訪問點供外部獲取該實例,其拓展是有限多例模式。⑵原型(Prototype)模式:將一個對象作為原型,通過對其進行復(fù)制而克隆出多個和原型類似的新實例。⑶工廠方法(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è)計模式(Java版)、2.2單例(Singleton)模式2.2.1模式的定義與特點
定義:指一個類只有一個實例,且該類能自行創(chuàng)建這個實例的一種模式。例如,Windows中的任務(wù)管理器、回收站等。
特點:1)單例類只有一個實例對象;2)該單例對象必須由單例類自行創(chuàng)建;3)單例類對外提供一個訪問該單例的全局訪問點。2.2.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)單例模式的主要角色有:⑴單例類:包含一個實例且能自行創(chuàng)建這個實例的類。⑵訪問者類:使用單例的類。其結(jié)構(gòu)圖如下:軟件設(shè)計模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)(續(xù))
普通類的構(gòu)造函數(shù)是公有的,外部類可以通過“new構(gòu)造函數(shù)()”來生成多個實例。但是,如果將類的構(gòu)造函數(shù)設(shè)為私有的,外部類就無法調(diào)用它生成多個實例了。這時該類自身必須定義一個靜態(tài)私有實例,并向外提供一個靜態(tài)的公有函數(shù)用于創(chuàng)建或獲取該靜態(tài)私有實例,有2種常見的實現(xiàn)形式。軟件設(shè)計模式(Java版)、2.2單例(Singleton)模式(續(xù))第1種:懶漢式單例該模式的特點是類加載時沒有生成單例,只有當?shù)谝淮握{(diào)用getInstance方法時才去創(chuàng)建這個單例。代碼如下:publicclassLazySingleton{privatestaticvolatileLazySingletoninstance=null;//保證instance在所有線程中同步privateLazySingleton(){}//private避免類在外部被實例化publicstaticsynchronizedLazySingletongetInstance(){//getInstance方法前加同步if(instance==null){instance=newLazySingleton();}returninstance;}}軟件設(shè)計模式(Java版)、2.2單例(Singleton)模式(續(xù))第2種:餓漢式單例該模式的特點是類一旦加載就創(chuàng)建一個單例,保證在調(diào)用getInstance方法之前單例已經(jīng)存在了。publicclassHungrySingleton{privatestaticfinalHungrySingletoninstance=newHungrySingleton();privateHungrySingleton(){}publicstaticHungrySingletongetInstance(){returninstance;}}軟件設(shè)計模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.3模式的應(yīng)用實例
【例2.1】用懶漢式單例模式模擬產(chǎn)生美國當今總統(tǒng)對象。
分析:在每一屆任期內(nèi),美國的總統(tǒng)只有一人,所以本實例適合用單例模式實現(xiàn),右邊是用懶漢式單例實現(xiàn)的結(jié)構(gòu)圖:
注:程序代碼見附件。軟件設(shè)計模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.3模式的應(yīng)用實例
【例2.2】用餓漢式單例模式模擬產(chǎn)生豬八戒對象。
分析:同樣豬八戒也只有一個,所以本實例同樣適合用單例模式實現(xiàn),右邊是用餓漢式單例實現(xiàn)的結(jié)構(gòu)圖:注:程序代碼見附件。軟件設(shè)計模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.3模式的應(yīng)用實例
【例2.2】用餓漢式單例模式模擬產(chǎn)生豬八戒對象。
右邊是程序的運行結(jié)果:軟件設(shè)計模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.4模式的應(yīng)用場景前面我們分析了單例模式的結(jié)構(gòu)與特點,現(xiàn)在來看看它通常適用的以下場景的特點:
(1)在應(yīng)用場景中,某類只要求生成一個對象的時候。如:一個班中的班長、每個人的身份證號等;(2)當對象需要被共享的場合。由于單例模式只允許創(chuàng)建一個對象,共享該對象可以節(jié)省內(nèi)存,并加快對象訪問速度。如:WEB中的配置對象、數(shù)據(jù)庫的連接池等。(3)當某類需要頻繁實例化,而創(chuàng)建的對象又頻繁被銷毀的時候。如:多線程的線程池、網(wǎng)絡(luò)連接池等。軟件設(shè)計模式(Java版)、2.2單例(Singleton)模式(續(xù))2.2.5模式的擴展單例模式可擴展為有限的多例(Multiton)模式,這種模式可生成有限個實例并保存在ArrayList中,客戶需要時可隨機獲取,其結(jié)構(gòu)圖如右:軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式2.3.1模式的定義與特點
定義:用一個已經(jīng)創(chuàng)建的實例作為原型,通過拷貝該原型對象來創(chuàng)建一個和原型相同或相似的新對象。在這里,原型實例指定了要創(chuàng)建的對象的種類。如:Windows中的COPY操作。
特點:創(chuàng)建對象非常高效,根本無需知道對象創(chuàng)建的細節(jié)。2.3.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)原型模式包含以下主要角色:⑴抽象原型類:規(guī)定了具體原型對象必須實現(xiàn)的接口。⑵具體原型類:實現(xiàn)抽象原型類的clone方法,它可被復(fù)制。⑶訪問者類:使用具體原型類中的clone方法來復(fù)制新的對象。軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)(續(xù))
其結(jié)構(gòu)圖如下:軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.2模式的結(jié)構(gòu)與實現(xiàn)
2.模式的實現(xiàn)原型模式的克隆分為淺克隆和深克隆,Java中的Object類提供了淺克隆的clone()方法,具體原型類只要實現(xiàn)Cloneable接口就可實現(xiàn)對象的淺克隆,這里的Cloneable接口就是抽象原型類。
//其實現(xiàn)代碼見附件軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.3模式的應(yīng)用實例
【例2.3】用原型模式模擬“孫悟空”復(fù)制自己。
分析:孫悟空拔下猴毛輕輕一吹就變出很多孫悟空,這實際上是用到了原型模式,右邊是其結(jié)構(gòu)圖:
注:程序代碼見附件軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.3模式的應(yīng)用實例
【例2.3】用原型模式模擬“孫悟空”復(fù)制自己。
//右邊是程序的運行結(jié)果:軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.3模式的應(yīng)用實例
【例2.4】用原型模式生成“三好學生”獎狀。
分析:同一學校的“三好學生”獎狀除了獲獎人姓名不同,其他都相同,屬于相似對象的復(fù)制,同樣可以用原型模式創(chuàng)建,然后再做簡單修改就可以了,右邊是其結(jié)構(gòu)圖:
注:程序代碼見附件軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.4模式的應(yīng)用場景原型模式通常適用以下場景:1)對象之間相同或相似,即只是個別的幾個屬性不同的時候。
2)對象的創(chuàng)建過程比較麻煩,但克隆比較簡單時候。軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式(續(xù))2.3.5模式的擴展原型模式可擴展為帶原型管理器的原型模式,它在原型模式的基礎(chǔ)上增加了一個原型管理器類。該類用HashMap保存多個原型的拷貝,Client類可以通過管理器的get(Stringid)方法從中獲取原型的拷貝,其結(jié)構(gòu)圖如右:軟件設(shè)計模式(Java版)、2.3原型(Prototype)模式(續(xù))
【例2.5】用帶原型管理器的原型模式來生成包含“圓”和“正方形”等圖形的原型。
分析:本實例中由于存在不同的圖形類,如:“圓”和“正方形”,它們計算面積的方法不一樣,所以需要用一個原型管理器來管理它們,右邊是其結(jié)構(gòu)圖:
注:程序代碼見附件軟件設(shè)計模式(Java版)、2.4本章小結(jié)本章主要介紹了創(chuàng)建型模式的特點和分類,以及單例模式與原型模式的定義與特點、結(jié)構(gòu)與實現(xiàn)、應(yīng)用場景和模式的擴展,并通過多個應(yīng)用實例來說明模式的使用方法。習題:見教材。軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()本章節(jié)結(jié)束,再見!軟件設(shè)計模式(Java版)、第3章創(chuàng)建型模式(下)內(nèi)容簡介?本章教學目標:
掌握工廠方法模式、抽象工廠模式、建造者模式的定義與特點、結(jié)構(gòu)與實現(xiàn);
學會使用工廠方法模式、抽象工廠模式、建造者模式開發(fā)應(yīng)用程序;
明白工廠方法模式、抽象工廠模式、建造者模式的應(yīng)用場景與擴展方向。?本章重點內(nèi)容:
三種創(chuàng)建型模式的特點和結(jié)構(gòu);
三種創(chuàng)建型模式的實現(xiàn)方法與應(yīng)用場景;
使用這三種創(chuàng)建型模式的編程方法。軟件設(shè)計模式(Java版)、3.1工廠方法(FactoryMethod)模式3.1.1模式的定義與特點
定義:定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將產(chǎn)品對象的實際創(chuàng)建工作推遲到具體子工廠類當中。這滿足創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點。如果要創(chuàng)建的產(chǎn)品不多,只要一個工廠類就可以完成,這種模式叫“簡單工廠模式”,它不屬于GoF的23種經(jīng)典設(shè)計模式,它的缺點是增加新產(chǎn)品時會違背“開閉原則”,本書不介紹。
優(yōu)點:1)用戶知道具體工廠的名稱就可得到所要的產(chǎn)品,無須知道產(chǎn)品的創(chuàng)建過程;2)增加新的產(chǎn)品時只需要添加具體產(chǎn)品類和對應(yīng)的具體工廠類,無需修改源代碼,滿足開閉原則。缺點:每增加一個產(chǎn)品就要增加一個具體產(chǎn)品類和一個對應(yīng)的具體工廠類,這增加了系統(tǒng)的復(fù)雜度。軟件設(shè)計模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)工廠方法模式的主要角色有:1)抽象工廠(AbstractFactory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過它訪問具體工廠的工廠方法newProduct()來創(chuàng)建產(chǎn)品。2)具體工廠(ConcreteFactory):主要是實現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。3)抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。4)具體產(chǎn)品(ConcreteProduct):實現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間一一對應(yīng)。軟件設(shè)計模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)右邊是其結(jié)構(gòu)圖:
2.模式的實現(xiàn)
//該模式的實現(xiàn)代碼見附件軟件設(shè)計模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.3模式的應(yīng)用實例
【例3.1】用工廠方法模式設(shè)計畜牧場。
分析:有很多種類的畜牧場,如養(yǎng)馬場用于養(yǎng)馬,養(yǎng)牛場用于養(yǎng)牛。所以該實例用工廠方法模式比較適合,右邊是其結(jié)構(gòu)圖:
注:程序代碼見附件軟件設(shè)計模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.3模式的應(yīng)用實例
【例3.1】用工廠方法模式設(shè)計畜牧場。
右邊是程序的運行結(jié)果軟件設(shè)計模式(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)品的細節(jié),只關(guān)心產(chǎn)品的品牌。軟件設(shè)計模式(Java版)、3.1工廠方法(FactoryMethod)模式(續(xù))3.1.5模式的擴展
當需要生成的產(chǎn)品不多且不會增加,一個具體工廠類就可以完成任務(wù)時,可刪除抽象工廠類。這時工廠方法模式將退化到簡單工廠模式,其結(jié)構(gòu)圖如右:軟件設(shè)計模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式
在前面介紹的工廠方法模式只考慮生產(chǎn)同等級的產(chǎn)品,但是在現(xiàn)實生活中許多工廠是綜合型的工廠,能生產(chǎn)多等級(種類)的產(chǎn)品,如農(nóng)場里既養(yǎng)動物又種植物,電器廠既生成電視機又生成洗衣機或空調(diào),大學既有軟件專業(yè)又有生物專業(yè)等等。本節(jié)要介紹的抽象工廠模式將考慮多等級產(chǎn)品的生產(chǎn),我們將同一個具體工廠所生產(chǎn)的位于不同等級的一組產(chǎn)品稱為一個產(chǎn)品族,右圖所示的是海爾工廠和TCL工廠所生成的電視機與空調(diào)對應(yīng)的關(guān)系圖:軟件設(shè)計模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.1模式的定義與特點
定義:是一種為訪問類提供一個創(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)一次只可能消費其中某一族產(chǎn)品,即同族的產(chǎn)品一起使用。
優(yōu)點:1)可以在類的內(nèi)部對產(chǎn)品族中相關(guān)聯(lián)的多等級產(chǎn)品共同管理,而不必專門引入多個新的類來進行管理;2)當增加一個新的產(chǎn)品族時不需要修改原代碼,滿足開閉原則。缺點:當產(chǎn)品族中需要增加一個新等級的產(chǎn)品時,則所有的工廠類都需要進行修改。軟件設(shè)計模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)抽象工廠模式的主要角色有:1)抽象工廠(AbstractFactory):提供了創(chuàng)建產(chǎn)品的接口,它包含多個創(chuàng)建產(chǎn)品的方法newProduct(),可以創(chuàng)建多個不同等級的產(chǎn)品。2)具體工廠(ConcreteFactory):主要是實現(xiàn)抽象工廠中的多個抽象方法,完成具體產(chǎn)品的創(chuàng)建。3)抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能,抽象工廠模式有多個抽象產(chǎn)品。4)具體產(chǎn)品(ConcreteProduct):實現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間是多對一的關(guān)系。軟件設(shè)計模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)右邊是其結(jié)構(gòu)圖:
2.模式的實現(xiàn)
//該模式的實現(xiàn)代碼見附件軟件設(shè)計模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.3模式的應(yīng)用實例
【例3.2】用抽象工廠模式設(shè)計農(nóng)場類。
分析:農(nóng)場中除了像畜牧場一樣可以養(yǎng)動物,還可以培養(yǎng)植物,如養(yǎng)馬、養(yǎng)牛、種菜、種水果等,所以本實例比前面介紹的畜牧場類復(fù)雜,必須用抽象工廠模式來實現(xiàn),右邊是其結(jié)構(gòu)圖:
注:程序代碼見附件軟件設(shè)計模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.3模式的應(yīng)用實例
【例3.2】用抽象工廠模式設(shè)計農(nóng)場類。
右邊是程序的運行結(jié)果軟件設(shè)計模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.4模式的應(yīng)用場景抽象工廠模式通常適用以下場景:1)當需要創(chuàng)建的對象是一系列相互關(guān)聯(lián)或相互依賴的產(chǎn)品族時,如:電器工廠中的電視機、洗衣機、空調(diào)等。2)系統(tǒng)中有多個產(chǎn)品族,但每次只使用其中的某一族產(chǎn)品。如:有的粉絲只喜歡穿李寧牌的衣、褲和鞋。3)系統(tǒng)中提供了產(chǎn)品的類庫,且所有產(chǎn)品的接口相同,客戶端不依賴產(chǎn)品實例的創(chuàng)建細節(jié)和內(nèi)部結(jié)構(gòu)。軟件設(shè)計模式(Java版)、3.2抽象工廠模式(AbstractFactory)模式(續(xù))3.2.5模式的擴展抽象工廠模式的擴展有一定的“開閉原則”傾斜性:1)當增加一個新的產(chǎn)品族時只需增加一個新的具體工廠,不需要修改原代碼,滿足開閉原則。2)當產(chǎn)品族中需要增加一個新種類的產(chǎn)品時,則所有的工廠類都需要進行修改,不滿足開閉原則。另一方面,當系統(tǒng)中只存在一個等級結(jié)構(gòu)的產(chǎn)品時,抽象工廠模式將退化到工廠方法模式。軟件設(shè)計模式(Java版)、3.3建造者(Builder)模式
在軟件開發(fā)過程中有時需要創(chuàng)建一個復(fù)雜的對象,這個復(fù)雜對象通常由多個子部件按一定的步驟組合而成。如:電腦是由CPU、主板、內(nèi)存條、硬盤、顯卡、機箱、顯示器、鍵盤、鼠標等部件組裝而成的,采購員不可能自己去組裝電腦,而是將電腦的配置要求告訴老板,老板指揮技術(shù)人員去組裝電腦,然后再交給要買電腦的采購員。生活中這樣的例子很多,它們都是由多個部件構(gòu)成的,各個部件可以靈活選擇,但其創(chuàng)建步驟都大同小異。這類產(chǎn)品的創(chuàng)建無法用前面介紹的工廠模式描述,只有建造者模式可以很好地描述該類產(chǎn)品的創(chuàng)建。軟件設(shè)計模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.1模式的定義與特點
定義:指將一個復(fù)雜對象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計模式被稱為建造者模式。它是將一個復(fù)雜的對象分解為多個簡單的對象,然后一步一步構(gòu)建而成。
優(yōu)點:1)各個具體的建造者相互獨立的,有利于系統(tǒng)的擴展;2)客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié),便于控制細節(jié)風險。缺點:1)產(chǎn)品的組成部分必須相同,這限制了其使用范圍;2)如果產(chǎn)品的內(nèi)部變化復(fù)雜,該模式會增加很多的建造者類。軟件設(shè)計模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.2模式的結(jié)構(gòu)與實現(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):實現(xiàn)了Builder接口,完成復(fù)雜產(chǎn)品的各個部件的具體創(chuàng)建方法。
4)指揮者(Director):它調(diào)用建造者對象中的部件構(gòu)造與裝配方法完成復(fù)雜對象的創(chuàng)建,在指揮者中不涉及具體產(chǎn)品的信息。軟件設(shè)計模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)右邊是其結(jié)構(gòu)圖:
2.模式的實現(xiàn)
//該模式的實現(xiàn)代碼見下頁:軟件設(shè)計模式(Java版)、3.3建造者(Builder)模式(續(xù))其相關(guān)類的的代碼如下:1)產(chǎn)品角色:是包含多個組成部件的復(fù)雜對象。
classProduct{privateStringpartA;privateStringpartB;privateStringpartC;publicvoidsetPartA(StringpartA){ this.partA=partA;}軟件設(shè)計模式(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è)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()3.3建造者(Builder)模式(續(xù))3)具體建造者:實現(xiàn)了抽象建造者接口。
publicclassConcreteBuilderextendsBuilder{publicvoidbuildPartA(){product.setPartA("建造PartA");}publicvoidbuildPartB(){product.setPartA("建造PartB");}publicvoidbuildPartC(){product.setPartA("建造PartC");}}軟件設(shè)計模式(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è)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()3.3建造者(Builder)模式(續(xù))5)客戶類
publicclassClient{publicstaticvoidmain(String[]args){Builderbuilder=newConcreteBuilder();Directordirector=newDirector(builder);Productproduct=director.construct();product.show();}}軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()3.3建造者(Builder)模式(續(xù))3.3.3模式的應(yīng)用實例
【例3.3】用建造者模式描述客廳裝修。
分析:客廳裝修是一個復(fù)雜的過程,它包含墻體的裝修、電視機的選擇、沙發(fā)的購買與布局等等??蛻舭蜒b修要求告訴項目經(jīng)理,項目經(jīng)理指揮裝修工人一步步裝修,最后完成整個客廳的裝修與布局,所以本實例用建造者模式實現(xiàn)比較適合,右邊是其結(jié)構(gòu)圖:
注:程序代碼見附件軟件設(shè)計模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.3模式的應(yīng)用實例
【例3.3】用建造者模式描述客廳裝修。
右邊是程序的運行結(jié)果軟件設(shè)計模式(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ù)雜對象的算法獨立于該對象的組成部分以及它們的裝配方式,即產(chǎn)品的構(gòu)建過程和最終的表示是獨立的。軟件設(shè)計模式(Java版)、3.3建造者(Builder)模式(續(xù))3.3.5模式的擴展建造者模式在應(yīng)用過程中可以根據(jù)需要改變,如果創(chuàng)建的產(chǎn)品種類只有一種,只需要一個具體的建造者,這時可以省略掉抽象建造者,甚至可以省略掉指導(dǎo)者角色。軟件設(shè)計模式(Java版)、3.4本章小結(jié)本章主要介紹了工廠方法模式、抽象工廠模式、建造者模式等三種創(chuàng)建型模式的定義、特點、結(jié)構(gòu)與實現(xiàn),并通過應(yīng)用實例介紹了這三種創(chuàng)建型模式的實現(xiàn)方法,最后分析了它們的應(yīng)用場景和擴展方向。習題:見教材。軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()本章節(jié)結(jié)束,再見!軟件設(shè)計模式(Java版)、第4章結(jié)構(gòu)型模式(上)內(nèi)容簡介?本章教學目標:
了解結(jié)構(gòu)型模式的特點與分類;
理解代理模式、適配器模式、橋接模式的定義與特點;
掌握代理模式、適配器模式、橋接模式的結(jié)構(gòu)與實現(xiàn);學會使用這三種設(shè)計模式開發(fā)應(yīng)用程序;明白這三種設(shè)計模式的擴展應(yīng)用。?本章重點內(nèi)容:
結(jié)構(gòu)型模式的定義、特點和分類方法;
代理模式的特點、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法;
適配器模式的特點、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法;
橋接模式的特點、結(jié)構(gòu)、應(yīng)用場景與應(yīng)用方法。軟件設(shè)計模式(Java版)、4.1結(jié)構(gòu)型模式概述結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)。它分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式,前者采用繼承機制來組織接口和類,后者采用組合或聚合來組合對象。由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復(fù)用原則”,所以對象結(jié)構(gòu)型模式比類結(jié)構(gòu)型模式具有更大的靈活性。結(jié)構(gòu)型模式分為以下7種:⑴代理(Proxy)模式:為某對象提供一種代理以控制對該對象的訪問。即客戶端通過代理間接地訪問該對象,從而限制、增強或修改該對象的一些特性。⑵適配器(Adapter)模式:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。⑶橋接(Bridge)模式:將抽象與實現(xiàn)分離,使他們可以獨立的變化。它是用組合關(guān)系代替繼承關(guān)系來實現(xiàn),從而降低了抽象和實現(xiàn)這2個可變維度的耦合度。軟件設(shè)計模式(Java版)、4.1結(jié)構(gòu)型模式概述(續(xù))
⑷裝飾(Decorator)模式:動態(tài)的給對象增加一些職責,即增加其額外的功能。⑸外觀(Facade)模式:為多個復(fù)雜的子系統(tǒng)提供一個一致的接口,使這些子系統(tǒng)更加容易被訪問。⑹享元(Flyweight)模式:運用共享技術(shù)來有效地支持大量細粒度對象的復(fù)用。⑺組合(Composite)模式:將對象組合成樹狀層次結(jié)構(gòu),使用戶對單個對象和組合對象具有一致的訪問性。以上7種結(jié)構(gòu)型模式,除了適配器模式分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式2種,其他的全部屬于對象結(jié)構(gòu)型模式。軟件設(shè)計模式(Java版)(ISDN:9787564740634)、人民郵電出版社()4.2代理(Proxy)模式4.2.1模式的定義與特點
定義:由于某些原因需要給某對象提供一個代理以控制對該對象的訪問。這時,訪問對象不適合或者不能直接引用目標對象,代理對象作為訪問對象和目標對象之間的中介。
優(yōu)點:1)代理模式在客戶端與目標對象之間起到一個中介作用和保護目標對象的作用;2)代理對象可以擴展目標對象的功能;3)代理模式能將客戶端與目標對象分離,在一定程度上降低了系統(tǒng)的耦合度。缺點:1)在客戶端和目標對象增加一個代理對象,會造成請求處理速度變慢;2)增加了系統(tǒng)的復(fù)雜度。軟件設(shè)計模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)代理模式的主要角色有:⑴抽象主題(Subject)類:通過接口或抽象類聲明真實主題和代理對象實現(xiàn)的業(yè)務(wù)方法。⑵真實主題(RealSubject)類:實現(xiàn)了抽象主題中的具體業(yè)務(wù),是代理對象所代表的真實對象,是我們最終要引用的對象。⑶代理(Proxy)類:提供了與真實主題相同的接口,其內(nèi)部含有對真實主題的引用,它可以訪問或控制或擴展真實主題的功能。其結(jié)構(gòu)圖如下:軟件設(shè)計模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)(續(xù)):
結(jié)構(gòu)圖如右:
2.模式的實現(xiàn)
//實現(xiàn)代碼見附件軟件設(shè)計模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.3模式的應(yīng)用實例
【例4.1】韶關(guān)“天街e角”公司是一家婺源特產(chǎn)公司的代售公司,用代理模式實現(xiàn)之。
分析:本例中的“婺源特產(chǎn)公司”經(jīng)營婺源特產(chǎn),它是真實主題;而韶關(guān)“天街e角”公司是婺源公司的代理,它可以調(diào)用婺源公司的相關(guān)方法,而且它可以增加一些額外的處理,如包裝或加價等;客戶端通過“天街e角”公司間接訪問“婺源公司”的產(chǎn)品,右邊是其結(jié)構(gòu)圖:
注:程序代碼見附件。軟件設(shè)計模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.3模式的應(yīng)用實例
【例4.1】韶關(guān)“天街e角”公司是一家婺源特產(chǎn)公司的代售公司,用代理模式實現(xiàn)之。
右邊是程序的運行結(jié)果:軟件設(shè)計模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.4模式的應(yīng)用場景1)遠程代理,這種方式通常是為了隱藏目標對象存在于不同地址空間的事實,方便客戶端訪問。例如用戶申請某些網(wǎng)盤空間時,會在用戶的文件系統(tǒng)中建立一個虛擬的硬盤,用戶訪問它實際訪問的是網(wǎng)盤空間。2)虛擬代理,這種方式通常用于要創(chuàng)建的目標對象開銷很大時。比如下載一幅很大的圖像需要很長時間,因某種計算比較復(fù)雜而短時間無法完成,這時可以先用小比例的虛擬代理替換真實的對象,消除用戶對服務(wù)器慢的感覺。3)安全代理,這種方式通常用于控制不同種類客戶對真實對象的訪問權(quán)限。4)智能指引,主要用于當調(diào)用目標對象時,代理附加一些額外的處理功能。比如增加計算真實對象的引用次數(shù)的功能,這樣當該對象沒有引用時,就可以自動釋放它。
5)延遲加載,指為了提高系統(tǒng)的性能,延遲對目標的加載。例如,Hibernate中就存在屬性的延遲加載和關(guān)聯(lián)表的延時加載。軟件設(shè)計模式(Java版)、4.2代理(Proxy)模式(續(xù))4.2.5模式的擴展前面介紹是靜態(tài)代理模式,存在兩個缺點:1)真實主題與代理主題一一對應(yīng),增加真實主題也要增加代理;2)設(shè)計代理以前真實主題必須事先存在,不太靈活。而采用動態(tài)代理模式可以解決以上問題,其結(jié)構(gòu)圖如右:軟件設(shè)計模式(Java版)、4.3適配器(Adapter)模式4.3.1模式的定義與特點
定義:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能一起工作。適配器模式分為類結(jié)構(gòu)型模式和對象結(jié)構(gòu)型模式2種。
優(yōu)點:
1)客戶端通過適配器可以透明地調(diào)用目標接口;2)程序員不需要修改原有代碼而重用現(xiàn)有的適配者類;3)將目標類和適配者類解耦,解決了目標類和適配者類接口不一致的問題。
缺點:對于類適配器來說,更換適配器的實現(xiàn)過程比較復(fù)雜。軟件設(shè)計模式(Java版)、4.3適配器(Adapter)模式(續(xù))4.3.2模式的結(jié)構(gòu)與實現(xiàn)
1.模式的結(jié)構(gòu)適配器模式包含以下主要角色:⑴目標(Target)接口:當前系統(tǒng)業(yè)務(wù)所期待的接口,它可以是抽象類或接口。⑵適配者(Adaptee)類:是被訪問和適配的現(xiàn)存組件庫中的組件接口。⑶適配器(Adapter)類:它一個轉(zhuǎn)換器,通過繼承或引用適配者的對象,把適配者接口轉(zhuǎn)換成目標接口,讓客戶按目標接口的格式訪問適配者。適配器模式分為:類適配器模式和對象適配器模式2種。軟件設(shè)計模式(Java版)、4.3適配器(Adapter)模式(續(xù))a.類適配器模式:其實現(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024行政單位預(yù)算管理風險控制合同
- 2024年耗材長期租賃與購買合同3篇
- 2024年限小學設(shè)施升級裝修服務(wù)協(xié)議版B版
- 氨制冷知識培訓
- 經(jīng)典特許經(jīng)營合同04年
- 動物園獸醫(yī)知識培訓課件
- 2024年西洋參電商銷售渠道合作協(xié)議3篇
- 中國勞動關(guān)系學院《英語公共演講》2023-2024學年第一學期期末試卷
- 浙江中醫(yī)藥大學《國際信貸與結(jié)算》2023-2024學年第一學期期末試卷
- 長治醫(yī)學院《自動化學科前沿講座》2023-2024學年第一學期期末試卷
- 2024-2025學年初中七年級上學期數(shù)學期末綜合卷(人教版)含答案
- 2024-2025學年北京市朝陽區(qū)高三上學期期末考試數(shù)學試卷(含答案)
- 四年級數(shù)學(除數(shù)是兩位數(shù))計算題專項練習及答案
- 辦理落戶新生兒委托書模板
- 四川省綿陽市涪城區(qū)2024-2025學年九年級上學期1月期末歷史試卷(含答案)
- 2025年山東水發(fā)集團限公司社會招聘高頻重點提升(共500題)附帶答案詳解
- 《湖南省房屋建筑和市政工程消防質(zhì)量控制技術(shù)標準》
- 施工現(xiàn)場環(huán)境因素識別、評價及環(huán)境因素清單、控制措施
- 2024年醫(yī)藥行業(yè)年終總結(jié).政策篇 易聯(lián)招采2024
- 《工業(yè)園區(qū)節(jié)水管理規(guī)范》
- 兒科護士述職報告2024
評論
0/150
提交評論