《軟件設(shè)計(jì)模式(Java版)》課件 程細(xì)柱 第0-5章 軟件設(shè)計(jì)模式教材簡介- 結(jié)構(gòu)型模式(下)_第1頁
《軟件設(shè)計(jì)模式(Java版)》課件 程細(xì)柱 第0-5章 軟件設(shè)計(jì)模式教材簡介- 結(jié)構(gòu)型模式(下)_第2頁
《軟件設(shè)計(jì)模式(Java版)》課件 程細(xì)柱 第0-5章 軟件設(shè)計(jì)模式教材簡介- 結(jié)構(gòu)型模式(下)_第3頁
《軟件設(shè)計(jì)模式(Java版)》課件 程細(xì)柱 第0-5章 軟件設(shè)計(jì)模式教材簡介- 結(jié)構(gòu)型模式(下)_第4頁
《軟件設(shè)計(jì)模式(Java版)》課件 程細(xì)柱 第0-5章 軟件設(shè)計(jì)模式教材簡介- 結(jié)構(gòu)型模式(下)_第5頁
已閱讀5頁,還剩173頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

本書從面向?qū)ο蟪绦蛟O(shè)計(jì)的7個基本原則出發(fā),用淺

顯易懂、可視化的UML

建模語言逐一介紹GoF的23種經(jīng)典設(shè)計(jì)模式。全書共9章,內(nèi)容包括設(shè)計(jì)模式基礎(chǔ)、創(chuàng)建

型模式(共5種)、結(jié)構(gòu)型模式(共7種)、行為型模式(共11種)、設(shè)計(jì)模式實(shí)驗(yàn)指導(dǎo)。前8章每章包括教學(xué)目

標(biāo)、主要知識點(diǎn)、價值引領(lǐng)、章節(jié)內(nèi)容、本章小結(jié)和習(xí)題

等內(nèi)容,對各個模式都介紹了模式的定義與特點(diǎn)、模式的結(jié)構(gòu)與實(shí)現(xiàn)、模式的應(yīng)用實(shí)例、模式的應(yīng)用場景和模式的

擴(kuò)展方向。第9章為上機(jī)實(shí)驗(yàn)指導(dǎo),可供讀者實(shí)踐與練習(xí)。本書配套有豐富的教學(xué)資源供下載,包括本書的課程標(biāo)準(zhǔn)、

教學(xué)設(shè)計(jì)、電子課件、實(shí)驗(yàn)大綱、上機(jī)指導(dǎo)、相關(guān)案例的源代碼、習(xí)題答案等內(nèi)容。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

ISBN:978-7-115-47788-圖書簡介教材特色1)采用“任務(wù)驅(qū)動、實(shí)例引導(dǎo)和實(shí)踐鞏固”的教學(xué)方法,根據(jù)各種設(shè)計(jì)模式之

間的關(guān)系和相似點(diǎn)組織教材內(nèi)容,結(jié)構(gòu)合理,層次分明。2)內(nèi)容緊跟市場,保持與市場同步,并且每章都包含思政內(nèi)容,教學(xué)目標(biāo)明確,

符合形勢發(fā)展。3)每章內(nèi)容豐富,每種模式提出了產(chǎn)生背景、模式定義與特點(diǎn)、模式的結(jié)構(gòu)與

實(shí)現(xiàn)、模式的應(yīng)用實(shí)例與應(yīng)用場景、模式的擴(kuò)展方向、知識點(diǎn)總結(jié)等內(nèi)容。2)原理分析直觀,首先用UML建模語言分析模式的結(jié)構(gòu),然后用簡單易懂的實(shí)

例加深學(xué)生對該模式的理解。3)有豐富的教學(xué)實(shí)例,每個實(shí)例取材于生活,并提供類圖和窗體界面,通俗易

懂。4)重視編程訓(xùn)練,做到理論與實(shí)踐相結(jié)合,提供實(shí)驗(yàn)指導(dǎo)和豐富的課后習(xí)題測

試,有利于提高學(xué)生的實(shí)踐能力。7)配套的教學(xué)資源豐富,方面老師教學(xué)和學(xué)生練習(xí)。軟件設(shè)計(jì)模式(Java

)(ISDN:9787564740634)、

作者:程細(xì)柱

人民郵電出版社本教材的程序源代碼全部在jdk1.6

和eclipse2013

環(huán)境下調(diào)式通過,讀者可從出版社

的教學(xué)資源網(wǎng)站(網(wǎng)址:http://www.ryjiaoyu.com/book/details/8402

)下載。所有代碼放在一個Java項(xiàng)目中,讀者在

eclipse

開發(fā)平臺下新建一個Java項(xiàng)目后,將全

部代碼拷貝到該Java項(xiàng)目的src

目錄下即可。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

ISBN:978-7-

115-47788-教材代碼使用說明樣書申請與其它配套教學(xué)資源·

資源各類本書配套有豐富的教學(xué)資源供下載,包括本書的課程標(biāo)準(zhǔn)、教學(xué)設(shè)計(jì)、電子課件、實(shí)驗(yàn)大綱、上機(jī)指導(dǎo)、相關(guān)案例的源代碼、習(xí)題答案等內(nèi)容

。教師可以免費(fèi)從人民郵電出版社的人郵網(wǎng)(http://www.ryjiaoyu.com/)

申請樣書,其他讀者可以從京東商城、

1號店、淘寶網(wǎng)、當(dāng)當(dāng)網(wǎng)、

亞馬遜書

城等著名網(wǎng)站購買。軟件設(shè)計(jì)模式軟件設(shè)計(jì)模式軟件設(shè)計(jì)模式¥32.40¥39.80¥42.80

¥2567.70¥39.80軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

教學(xué)資源網(wǎng)址:·

教材購買點(diǎn)¥42.30日暫無律論凸100%歡迎使用,謝謝!軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

教學(xué)資源網(wǎng)址:內(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ì)原則?!?/p>

本章價值引領(lǐng):通過23種設(shè)計(jì)模式的簡單介紹,讓學(xué)生明白提高自己的科學(xué)精神和科學(xué)意識

的重要性;通過6種類關(guān)系的介紹,讓學(xué)生理解社會主義核心價值,增強(qiáng)學(xué)生科技強(qiáng)國的

責(zé)任感與使命感;通過7種設(shè)計(jì)原則的介紹,培養(yǎng)學(xué)生遵守軟件工程規(guī)范,提高自己的職業(yè)素養(yǎng)

和工匠精神。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱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)中

心主任Christopher

Alexander

(

克里斯托弗

·亞歷山大)在他的著作《建筑模式

語言:城鎮(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

年,Erich

Gamma,Richard

Helm,Ralph

Johnson,John

Vlissides等四位作者

合作出版了《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》

一書,在此書中共收錄了

23

個設(shè)計(jì)模式,這是設(shè)計(jì)模式領(lǐng)域里程碑的事件,導(dǎo)致了軟件設(shè)計(jì)模式的突破。ISBN:978-7-115-47788-軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.2軟件設(shè)計(jì)模式的概念與意義1.什么是軟件設(shè)計(jì)模式?軟件設(shè)計(jì)模式

(

Software

Design

pattern),

又稱設(shè)計(jì)模式

,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)

結(jié)。2.學(xué)習(xí)設(shè)計(jì)模式的意義(1)可以提高程序員的思維能力、編程能力和設(shè)計(jì)能力。(2)使程序設(shè)計(jì)更加標(biāo)準(zhǔn)化、代碼編制更加工程化,使軟件開發(fā)

效率大大提高,從而縮短軟件的開發(fā)周期。(3)使設(shè)計(jì)的代碼可重用性高、可讀性強(qiáng)、可靠性高、靈活性好、

可維護(hù)性強(qiáng)。ISBN:978-7-115-47788-軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱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.模式名稱與特點(diǎn)2.問題與解決方案3.實(shí)現(xiàn)方法與效果4.應(yīng)用環(huán)境與擴(kuò)展ISBN:978-7-115-47788-軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.4

GoF的23種設(shè)計(jì)模式簡介設(shè)計(jì)模式有兩種分類方法,即:根據(jù)目的分和根據(jù)作用的范圍分。1.根據(jù)目的來分(1)

創(chuàng)建型模式:用于描述“怎樣創(chuàng)建對象”,它的主要特點(diǎn)是

“將對象的創(chuàng)建與使用分離”。GoF中提供了5種創(chuàng)建型模式。(2)

結(jié)構(gòu)型模式:用于描述如何將類或?qū)ο蟀茨撤N布局組成更大

的結(jié)構(gòu),GoF中提供了7種結(jié)構(gòu)型模式。(3)

行為型模式:用于描述類或?qū)ο笾g怎樣相互協(xié)作共同完成

單個對象都無法單獨(dú)完成的任務(wù),以及怎樣分配職責(zé)。GoF中提供了

11種行為型模式。ISBN:978-7-115-47788-軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.4

GoF的23種設(shè)計(jì)模式簡介(續(xù))2.根據(jù)作用范圍來分(1)

類模式:用于處理類與子類之間的繼承關(guān)系,這些關(guān)系是靜

態(tài)

。(2)

對象模式:用于處理對象之間的組合或聚合關(guān)系,具動態(tài)性。ISBN:978-7-115-47788-軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱范圍\目的創(chuàng)建型模式結(jié)構(gòu)型模式行為型模式類模式工廠方法(類)適配器模板方法、解釋器對象模式單例原型抽象工廠建造者代理(對象)適配器橋接裝飾外觀享元組合策略命令職責(zé)鏈狀態(tài)觀察者中介者迭代器訪問者備忘錄1.1

軟件設(shè)計(jì)模式概述(續(xù))表1.1

GoF的23種設(shè)計(jì)模式的分類表軟件設(shè)計(jì)模式(Java

版)(ISDN:9787564740634)

、作者:程細(xì)柱ISBN:978-7-115-47788-人民郵電出版社1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.4

GoF的23種設(shè)計(jì)模式簡介(續(xù))3.GoF

的23種設(shè)計(jì)模式的功能·

單例

(Singleton)

模式:某個類只能生成一個實(shí)例,該類提供了一個全局訪問點(diǎn)供外部獲取該實(shí)例,其拓展是有限多例模式。·

原型(Prototype)模式:將一個對象作為原

型,通過對其進(jìn)行復(fù)制而克隆出多個和原型類似的新實(shí)例?!?/p>

工廠方法(FactoryMethod)

式:定義一個用于創(chuàng)建產(chǎn)品的

接口,由子類決定生產(chǎn)什么產(chǎn)品?!?/p>

抽象工廠

(Abstract

Factory)

模式:提供一個創(chuàng)建產(chǎn)品族的

接口,其每個子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品。ISBN:978-7-115-47788-軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.4

GoF的23種設(shè)計(jì)模式簡介(續(xù))3.GoF

的23種設(shè)計(jì)模式的功能(續(xù))·

建造者

(Builder)

模式:將一個復(fù)雜對象分解成多個相對簡單的部分,然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對象。·

代理

(Proxy)

模式:為某對象提供一種代理以控制對該對象

問。即客戶端通過代理間接地訪問該對象,從而限制、增強(qiáng)或修

改該對象的一些特性?!?/p>

適配器

(Adapter)

模式:將一個類的接口轉(zhuǎn)換成客戶希望的

另外一個接口,使得原本由于接口不兼容而不能一起工作的那些類能

一起工作。ISBN:978-7-115-47788-軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.4

GoF的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é),即增加

其額外的功能?!?/p>

外觀(Facade)模式:為多個復(fù)雜的子系統(tǒng)提供一個一致的接口,

使這些子系統(tǒng)更加容易被訪問。教學(xué)資源網(wǎng)址:軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.4

GoF的23種設(shè)計(jì)模式簡介(續(xù))3.GoF

的23種設(shè)計(jì)模式的功能(續(xù))·

元(Flyweight)模式:運(yùn)用共享技術(shù)來有效地支持大量細(xì)粒

度對象的復(fù)用?!?/p>

組合(Composite)模式:將對象組合成樹狀層次結(jié)構(gòu),使用戶

對單個對象和組合對象具有一致的訪問性?!?/p>

模板方法(Template

Method)

模式:定義一個操作中的算法

骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算

法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟。教學(xué)資源網(wǎng)址:軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.4

GoF的23種設(shè)計(jì)模式簡介(續(xù))3.GoF

的23種設(shè)計(jì)模式的功能(續(xù))·

策略

(Strategy)

模式:定義了一系列算法,并將每個算法封

裝起來,使他們可以相互替換,且算法的改變不會影響到使用算法的客戶?!?/p>

命令

(Command)

模式:將一個請求封裝為一個對象,使發(fā)出

請求的責(zé)任和執(zhí)行請求的責(zé)任分割開?!?/p>

職責(zé)鏈(Chain

of

Responsibility)

模式:把請求從鏈中的一個對象傳到下一個對象,直到請求被響應(yīng)為止。通過這種方式去除

對象之間的耦合。教學(xué)資源網(wǎng)址:軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·

1.1.4

GoF的23種設(shè)計(jì)模式簡介(續(xù))3.GoF

的23種設(shè)計(jì)模式的功能(續(xù))·

狀態(tài)(Stat

e)

模式:允許一個對象在其內(nèi)部狀態(tài)發(fā)生改變時

改變其行為能力?!?/p>

觀察者

(Observer)

模式:多個對象間存在

對多關(guān)系,當(dāng)一

個對象發(fā)生改變時,把這種改變通知給其它多個對象,從而影響其它

對象的行為。·

中介者

(Mediator)模

式:

定義一個中介對象來簡化原有對象

之間的交互關(guān)系,降低系統(tǒng)中對象間的耦合度,使原有對象之間不必

相互了解。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.1

軟件設(shè)計(jì)模式概述(續(xù))·1.1.4

GoF的23種設(shè)計(jì)模式簡介(續(xù))3.GoF

的23種設(shè)計(jì)模式的功能(續(xù))·

迭代器

(Iterator)模式:提供一種方法來順序訪問聚合對象

中的一系列數(shù)據(jù),而不暴露聚合對象的內(nèi)部表示?!?/p>

訪問者

(Visitor)

模式:在不改變集合元素的前提下,為

個集合中的每個元素提供多種訪問方式,即每個元素有多個訪問者對

?!?/p>

備忘錄(Memento)模

式:在不破壞封裝性的前提下,

獲取并

保存一個對象的內(nèi)部狀態(tài),以便以后恢復(fù)它

?!?/p>

解釋器(Interpreter)模式:提供如何定義語言的文法,以及對語言句子的解釋方法,即解釋器。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.2

UML中的類圖·1.2.1統(tǒng)一建模語言簡介●統(tǒng)一建模語言(Unified

Modeling

Language,簡

:UML):是用來設(shè)計(jì)軟件藍(lán)圖的可視化建模語言,1997年被國際對象組織0MG

采納為為面向?qū)ο蟮慕UZ言的國際標(biāo)準(zhǔn)?!?/p>

它的特點(diǎn):

是簡單、統(tǒng)一、圖形化、能表達(dá)軟件設(shè)計(jì)中的動態(tài)

與靜態(tài)信息?!ML

從目標(biāo)系統(tǒng)的不同角度出發(fā),

定義了:

用例圖、類圖、對

象圖、狀態(tài)圖、活動圖、序列圖、協(xié)作圖、構(gòu)件圖、部署圖等9種圖。注:本教材主要介紹軟件設(shè)計(jì)模式中經(jīng)常用到的類圖,以及類之間的關(guān)系。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.2

UML中的類圖(續(xù))·1.2.2類、接口和類圖1.

(Class)類是指具有相同屬性、方法和關(guān)系的對象的抽象,它具有封裝性、

繼承性和多態(tài)性等三大特性。在UML中類包含:(1)

類名

(Name)

是一個字符串,如:Student。(2)

屬性

(Attribute)

是指類的特性,即類的成員變量。格式:[可見性]屬性名:類型[=缺省值]注意:“可見性”表示該屬性對于類外的元素而言是否可見,

在類圖中分別用符號+、一、#、~表示。

如:-name:String(3)

操作(Operations)是類的成員方法。格式:[可見性]名稱(參數(shù)列表)[:返回類型]軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱Student-no:long-name:String-school:String-totalScore:float+display():void1.2

UML中的類圖(續(xù))·下圖是學(xué)生類的UML

表示:軟件設(shè)計(jì)模式(Java

版)(ISDN:9787564740634)、作者:程細(xì)柱

人民郵電出版社1.2

UML中的類圖(續(xù))·1.2.2類、接口和類圖2.

(Interface)接口是一種特殊的類,它包含抽象操作,但不包含屬性。它描述

了類或組件對外可見的動作。下圖是圖形類接口的UML表示:Graph+getArea():double+getPerimeter():double軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱·1.2.2類、接口和類圖3.類

(ClassDiagram)類圖是用來顯示系統(tǒng)中

的類、接口、協(xié)作以及它們

之間的靜態(tài)結(jié)構(gòu)和關(guān)系的

種靜態(tài)模型。右邊是“計(jì)算長方形和

圓形的周長與面積”的類圖:1.2

UML中的類圖(續(xù))《

訪問

》Client+calculate(Graph

tx):voidRectangle-length:double-width:double+getArea():double+getPerimeter():doubleCircular-radius:double+getArea():double+getPerimeter():doubleGraph+getArea():double+getPerimeter():double軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱·1.2.3類之間的關(guān)系1.依

(Dependency)

關(guān)系依賴關(guān)系是一種使用關(guān)系,

它是對象之間耦合度最弱的一種

關(guān)聯(lián)方式。在代碼中,某個類的方法通過局部變量、方法的參數(shù)或者對

靜態(tài)方法的調(diào)用來訪問另一個類

(被依賴類)中的某些方法來完

成一些職責(zé)。1.2

UML中的類圖(續(xù))Person-name:String+call(MobilePhonemp):voidpublicvoidcall(MobilePhonemp){mp.transfer();//

語音傳送MobilePhone+transfer():void軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱_打電話_1.2

UML中的類圖(續(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)可以是雙向的,也可以是單向的。Student-name:String-teas:List<Teacher>

+study():voidTeacher-name:Stringstus:List<Student>

+teaching():voidteaches

教學(xué)者軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱to?學(xué)習(xí)者1.2

UML中的類圖(續(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é)校停辦了,老師依然存在。Teacher-name:String

+teaching():voidUniversityteas:List<Teacher>軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.2

UML中的類圖(續(xù))·

1.2.3類之間的關(guān)系4.組合

(Composition)關(guān)系組合關(guān)系也表示類之間的整體與部分的關(guān)系,但它是一種更強(qiáng)烈的

聚合關(guān)系,是contains-a

關(guān)系。整體對象可以控制部分對象的生命周期,一旦整體對象不存在,部分對象也將不存在,部分對象不能脫離整體對

象而存在。例如,頭和嘴的關(guān)系,沒有了頭,嘴也就不存在了。Head-mouth:MouthMouth+eat():void軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱·

1.2.3類之間的關(guān)系5.泛化

(Generalization)

關(guān)系泛化關(guān)系是對象之間耦合度

最大的一種關(guān)系,表示一般與特

殊的關(guān)系,是父類與子類之間的

關(guān)系,是一種繼承關(guān)系,是is-a

的關(guān)系。Student-studentNo:long+study():voidTeacher-teacherNo:long

+teaching():void1.2

UML中的類圖(續(xù))Person-name:String-age:int+speak():void軟件設(shè)計(jì)模式(Java版)、作者:程細(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)了交通工具,其類

圖如下

:1.2

UML中的類圖(續(xù))Car+move():voidShip+move():void軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.3面向?qū)ο蟮脑O(shè)計(jì)原則·1.3.1開閉原則1.開閉原則的定義特梅耶(Bertrand

Meyer)

在1988年的著作《面向?qū)ο筌浖?gòu)造》中

,這里的軟件實(shí)體包括以下幾個部分:1)項(xiàng)目中劃分出的模塊;2)

類與接口;3)方法。2.開閉原則的重要性(1)

對軟件測試的影響,軟件測試時只需要對擴(kuò)展的代碼進(jìn)行測試就。(2)可以提高代碼的可復(fù)用性。(3)可以提高軟件的可維護(hù)性,易于擴(kuò)展和維護(hù)。

(OCP):

軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉。勃蘭·開閉原則軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱《訪問類》Abstractsubject

Windows-subject:Abstractsubject

+display():void《具體主題》

《具體主題》SpecificSubject01

SpecificSubject02+display():void

+display():void3.開閉原則的實(shí)現(xiàn)方法可以通過“抽象約束、封裝變化”來實(shí)現(xiàn)開閉

原則,即通過接口或者

抽象類為軟件實(shí)體定義

一個相對穩(wěn)定的抽象層,

而將相同的可變因素封

裝在相同的具體實(shí)現(xiàn)類

中。【例1

.1】操作系統(tǒng)的

桌面主題設(shè)計(jì)實(shí)例(代碼1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))軟件設(shè)計(jì)模式。(Java版)、作者:程細(xì)柱1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))·

1.3.2里氏替換原則1.里氏替換原則的定義里氏替換原則(

LSP)

:

繼承必須確保超類所擁有的性質(zhì)在子類中仍然

成立。由麻省理工學(xué)院計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室的Liskov

女士在1987年的00PS

LA

(面向?qū)ο蠹夹g(shù)的高峰會議)上發(fā)表的一篇文章《數(shù)據(jù)抽象和層

次》里面提出來的。2.里氏替換原則的重要性(1)里氏替換原則是實(shí)現(xiàn)開閉原則的重要方式之一。(2)它克服了繼承中重寫父類造成的可復(fù)用性變差的缺點(diǎn)。(3)它是動作正確性的保證。即類的擴(kuò)展不會給已有的系統(tǒng)引入新的

錯誤,降低了代碼出錯的可能性。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱鳥類

訪問類BirdN102LSPtest#kind:String#speed:int

+main(String[]args):void+Bird(String

kind)+setSpeed():void+show(int

s):void幾維鳥類BrownKiwi+BrownKiwi(String

kind)+setSpeed():void說明:以上類圖違背了“

里氏替換原則”,

。3.里氏替換原則的實(shí)現(xiàn)方法子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能?!纠?

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

。分析:

鳥一般都會飛行,它們的飛行速度一般在每小時

30至60千米之間。但是新西蘭

的“幾維鳥”,由于翅膀退化,

因此無法飛行。

//程序代碼見附件1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱以上程序運(yùn)行錯誤的

原因是:幾維鳥類重寫了鳥類的setSpeed(doublespeed)

方法,這違背了

里氏替換原則。正確的

做法是:取消幾維鳥原

來的繼承關(guān)系,定義鳥

和幾維鳥的更一般的父

類,如動物類,它們都

有奔跑的能力。右邊是

其類圖:動物類訪問類Animal

N102LSPtest+main(String[args):voidspeed):void1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))普通鳥類幾維鳥類OrdinaryBird

BrownKiwi//修改代碼見附件軟件設(shè)計(jì)模式(Java

)

作者:程細(xì)柱+BrownKiwi(String

kind)

+show(int

s):void#kind:String#speed

:int+setSpeed(int+OrdinaryBird(String

+show(ints):voidkind)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)編程。是Object

Mentor公司總

裁RobertC.Martin于1996年在C++Report上發(fā)表的文章中提出的。2.依賴倒置原則的重要性(1)依賴倒置原則可以降低類間的耦合性。(2)依賴倒置原則可以提高系統(tǒng)的穩(wěn)定性。(3)依賴倒置原則可以減少并行開發(fā)引起的風(fēng)險。(4)依賴倒置原則可以提高代碼的可讀性和可維護(hù)性。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.依賴倒置原則的實(shí)現(xiàn)方法我們在實(shí)際編程中只要遵循以下四點(diǎn),就能在項(xiàng)目中滿足這個規(guī)則:(1)每個類盡量提供接口或抽象類,或者兩者都具備。(2)變量的聲明類型盡量是接口或者是抽象類。(3)任何類都不應(yīng)該從具體類派生。(4)使用繼承時盡量遵循里氏替換原則。【例1.3】依賴倒置原則在農(nóng)村土特產(chǎn)售賣程序中的應(yīng)用。分析:如顧客類的shopping(ShaoguanShop

shop)方法只訪問韶關(guān)網(wǎng)

店,如果該顧客想從另外一家商店(如:婺源網(wǎng)店WuyuanShop)購物,

就要修改該方法的參數(shù)類型,這違背了“依賴倒置”原則。解決方法

是:定義一個商店接口Shop,

顧客類面向該接口編程,其類圖如下。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))·

下面是顧客購物程序的類圖,其程序源代碼見附件?!?/p>

》Customer+shopping(Shop

shop):void+sell():String+sell():String軟件設(shè)計(jì)模式(Java版

)(ISDN:9787564740634)、

作者:程細(xì)柱

社publicvoidshopping(Shopshop){System.outprintln(shop.sell();《

關(guān)

網(wǎng)

》ShaoguanShop《

源網(wǎng)

WuyuanShop1.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é)原則的重要性(1)

降低類的復(fù)雜度。(2)

提高類的可讀性。復(fù)雜性降低,自然其可讀性會提高。(3)

提高系統(tǒng)的可維護(hù)性??勺x性提高,那自然更容易維護(hù)了。(4)變更引起的風(fēng)險降低。變更是必然的,如果單一職責(zé)原則遵守得

好,當(dāng)修改一個功能時,可以顯著降低對其他功能的影響。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱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)?!纠?

.4】大學(xué)的學(xué)生指導(dǎo)工作管理程序設(shè)計(jì)。分析:大學(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

版)、作者:程細(xì)柱1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))·大學(xué)學(xué)生工作管理程序的類圖如下:學(xué)生工作+生活輔導(dǎo)(輔導(dǎo)員teacher):void+學(xué)業(yè)指導(dǎo)(學(xué)業(yè)導(dǎo)師

teacher):void輔導(dǎo)員

學(xué)業(yè)導(dǎo)師軟件設(shè)計(jì)模式(Java

)(ISDN:9787564740634)

作者:程細(xì)柱

人民郵電出版社+班委建設(shè)():void

+出勤統(tǒng)計(jì)():void+心理輔導(dǎo)():void+費(fèi)用催繳():void

+班級管理():void+專業(yè)引導(dǎo)():void+學(xué)習(xí)輔導(dǎo)():void+科研指導(dǎo)():void

+學(xué)習(xí)總結(jié)():void1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))·

1.3.5接口隔離原則1.接口隔離原則的定義接口隔離原則

(ISP)含義是:

客戶端不應(yīng)該被迫依賴于它不使用的方法。2002

年羅伯特·C

·

馬丁在《敏捷軟件開發(fā):原則、模式和實(shí)踐》一書中提出,它要求程

序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感

興趣的方法。2.接口隔離原則的重要性(1)將臃腫龐大的接口分解,可以預(yù)防外來變更的擴(kuò)散。(2)接口隔離提高了系統(tǒng)的內(nèi)聚性,減少了對外交互。(3)如果接口的粒度大小定義合理,能夠保證系統(tǒng)的穩(wěn)定性。(4)使用多個專門的接口還能夠體現(xiàn)對象的層次。(5)

能減少項(xiàng)目工程中的代碼冗余。過大的接口里面通常放置許多不用的方法。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.接口隔離原則的實(shí)現(xiàn)方法在具體應(yīng)用接口隔離原則時,應(yīng)該根據(jù)以下幾個規(guī)則來衡量:(1)接口盡量小,但是要有限度。(2)只提供調(diào)用者需要的方法,屏蔽不需要的方法。(3)了解環(huán)境,拒絕盲從。(4)提高內(nèi)聚,減少對外交互?!纠?

.5】學(xué)生成績管理程序。分析:

學(xué)生成績管理程序一般包含插入成績、刪除成績、修改成績、

計(jì)算總分、計(jì)算均分、打印成績信息、查詢成績信息等功能,如果將

這些功能全部放到一個接口中顯然不太合理,正確的做法是將它們分

別放在輸入模塊、統(tǒng)計(jì)模塊和打印模塊等3個模塊中,其類圖如下。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱CountModule+countTotalScore():void+countAverage():void△《

實(shí)

現(xiàn)

》StuScoreList-StuScoreList()+getlnputModule():InputModule+getCountModule():CountModule+getPrintModule():PrintModule+insert():void+delete():void+modify():void+countTotalScore():void+countAverage():void+printStulnfo():void+queryStulnfo():void3.接口隔離原則

的實(shí)現(xiàn)方法右邊是學(xué)生成

績管理程序的類

圖://其程序代碼見附件1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))軟件設(shè)計(jì)模式(Java

)(ISDN:9787564740634)、

作者:程細(xì)柱

人民郵電出版社PrintModule+printStulnfo():void+queryStulnfo():voidInputModule+insert():void

+delete():void+modify():void1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))·1.3.6迪米特法則1.迪米特法則的定義迪米特法則(LoD)

又叫作最少知識原則

(LKP),

其定義是:只與你

的直接朋友交談,不跟“陌生人”說話。1987年美國東北大學(xué)的lanHolland提出,后來又因?yàn)樵诮?jīng)典著作《程序員修煉之道》而廣為人知。迪米特法則中的“朋友”是指:

當(dāng)前對象本身、當(dāng)前對象的成員對

、當(dāng)前對象所創(chuàng)建的對象、當(dāng)前對象的方法參數(shù)等,這些對象同當(dāng)前

對象存在關(guān)聯(lián)、聚合或組合關(guān)系,可以直接訪問這些對象的方法。2.迪米特法則的重要性(1)

降低了類之間的耦合度,提高了模塊的相對獨(dú)立性。(2)由于耦合度降低,從而提高了類的可復(fù)用率和系統(tǒng)的擴(kuò)展性。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))3.迪米特法則的實(shí)現(xiàn)方法在運(yùn)用迪米特法則時要注意以下六點(diǎn):(1)在類的劃分上,應(yīng)該創(chuàng)建弱耦合的類。(2)在類的結(jié)構(gòu)設(shè)計(jì)上,盡量降低類成員的訪問權(quán)限。(3)在類的設(shè)計(jì)上,優(yōu)先考慮將一個類設(shè)置成不變類。(4)在對其他類的引用上,將引用其它對象的次數(shù)降到最低。(5)不暴露類的屬性成員,而應(yīng)該提供相應(yīng)的訪問器

(se

t和get方法

)

。(6)謹(jǐn)慎使用序列化

(Serializable)

功能。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱科學(xué)家Scientist-name:Sting+Scientist(String

name)

+getName():Stringpublic

voidinterview(){System.out.println(media.getName()+"采訪科學(xué)家"+person.getName();publicvoidbusiness(){System.out.println(manager

getName()+"與科學(xué)家"+person.getName()+"洽淡業(yè)務(wù)");【例1

.6】迪米特法則在科學(xué)家的社交活動中的應(yīng)用。分析:

科學(xué)家由于全身心投入科研工作,

所以許多社交活動由

研究助理負(fù)責(zé)聯(lián)系和

安排,所以適合使用

迪米特法則,右邊是

其類圖:研究助理Assistant-person:Scientist-media:NewsMedia-manager:Company+setScientist(Scientist

person):void+setNewsMedia(NewsMediamedia):void+setCompany(Company

manager):void

+interview():void+business():void新聞媒體NewsMedia-name:Sting+NewsMedia(String

name)

+getName():String企業(yè)Company-name:String+Company(Stringname)

+getName():String1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱//其程序代碼見附件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ù)用原則的重要性(1)

維持了類的封裝性。因?yàn)槌煞謱ο蟮膬?nèi)部細(xì)節(jié)是新對象看不見

的,所以這種復(fù)用又稱為“黑箱”復(fù)用;(2)

新舊類之間的耦合度低。這種復(fù)用所需的依賴較少,新對象存取

成分對象的唯一方法是通過成分對象的接口;(3)復(fù)用的靈活性高。這種復(fù)用可以在運(yùn)行時動態(tài)進(jìn)行,新對象可以

動態(tài)地引用與成分對象類型相同的對象。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱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)用?!纠?

.7】汽車分類管理程序。分析:汽車按“動力源”劃分可分為汽油汽車、電動汽車等,按“顏色”劃分可分為白色汽車、黑色汽車和紅色汽車等,如果同時考慮這兩種分類,其組合就很多。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))·

以下是用繼承關(guān)系實(shí)現(xiàn)的汽車分類的類圖:Car+Car()+move():void+move():void

+move():void

+move():void

+move():void

+move():oid

+move():oid軟件設(shè)計(jì)模式(Java版

)(ISDN:9787564740634)

、作者:程細(xì)柱

人民郵電出版社+move():void+move():void《白色汽油汽車》

WhiteGasolineCar《黑色汽油汽車》

BlackGasolineCar《黑色電動汽車》

BlackElectricCar《白色電動汽車》

WhiteElectricCar《紅色汽油汽車》

RedGasolineCar《紅色電動汽車》

RedElectricCar《電動汽車》

ElectricCar《汽油汽車》

GasolineCar1.3面向?qū)ο蟮脑O(shè)計(jì)原則(續(xù))·可能看出可以看出用繼承關(guān)系實(shí)現(xiàn)會產(chǎn)生很多子類,而且增加新的“顏色”

要修改源代碼,這違背了“開-閉”原則,顯然不可取。但如果改用組合關(guān)

系實(shí)現(xiàn)就能很好地解決以上問題,其類圖如下:Car#color:Color+Car(Color

color)+move():void

Color《汽油汽車》

GasolineCar《電動汽車》ElectricCarWhite

Black

Red+move():void+move():void軟件設(shè)計(jì)模式(Java

)(ISDN:9787564740634)、作者:程細(xì)柱人民郵電出版社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ì)原則?!?/p>

習(xí)題:

見教材。軟件設(shè)計(jì)模式(Java

版)(ISDN:9787564740634)、作者:程細(xì)柱人民郵電出版社本章節(jié)結(jié)束,再見!軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱內(nèi)容簡介·

本章教學(xué)目標(biāo):掌握單例模式與原型模式的定義與特點(diǎn)、結(jié)構(gòu)與實(shí)現(xiàn);熟悉使用單例模式與原型模式開發(fā)應(yīng)用程序;了解創(chuàng)建型模式的特

點(diǎn)和

與擴(kuò)

?!け菊聝r值引領(lǐng):通過介紹單例模式的優(yōu)點(diǎn),培養(yǎng)學(xué)生提高資源利用率和數(shù)據(jù)可靠性

識;通過孫悟空實(shí)例,提高學(xué)生文化強(qiáng)國意識和為中國動漫產(chǎn)業(yè)盡一份

力的思想;通過介紹原型模式的主要優(yōu)點(diǎn),提高學(xué)生的科學(xué)創(chuàng)新與科技強(qiáng)國的

方法。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

ISBN:978-7-

115-47788-2.1

創(chuàng)建型模式概述·

創(chuàng)建型模式的主要特點(diǎn)是什么?它的主要特點(diǎn)是“將對象的創(chuàng)建與使用分離”

,這樣可以降低系統(tǒng)的耦合度?!?chuàng)建型模式分為以下幾種:(1)

單例(Singleton)

模式:某個類只能生成一個實(shí)例,該類提供了一個全

局訪問點(diǎn)供外部獲取該實(shí)例,其拓展是有限多例模式。(2)

原型(Prototype)模

式:將一個對象作為原型,通過對其進(jìn)行復(fù)制而克

隆出多個和原型類似的新實(shí)例。(3)

工廠方法

(Factory

Method)

模式:定義一個用于

創(chuàng)建產(chǎn)品的接口,由子

類決定生產(chǎn)什么產(chǎn)品。(4)

抽象工廠(Abstract

Factory)

模式:提供一個創(chuàng)建產(chǎn)品族的接口,其每

個子類可以生產(chǎn)一系列相關(guān)的產(chǎn)品。(5)

建造者

(Builder)模

式:將一個復(fù)雜對象分解成多個相對簡單的部分,

然后根據(jù)不同需要分別創(chuàng)建它們,最后構(gòu)建成該復(fù)雜對象。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

ISBN:978-7-115-47788-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模式的結(jié)構(gòu)與實(shí)現(xiàn)1.模式的結(jié)構(gòu)單例模式的主要角色有:(1)

單例類:包含一個實(shí)例且能自行創(chuàng)建這個實(shí)例的類。(2)

訪問者類:使用單例的類。其結(jié)構(gòu)圖如下:軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

ISBN:978-7-115-47788-·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)形式。publicstaticsynchronizedSingletongetlnstance(){if(instance==null){//

用懶漢方式實(shí)現(xiàn)instance=new

Singleton();}else{System.out.println("單例對象已經(jīng)創(chuàng)建!");return

instance;2.2單例

(Singleton)

模式(續(xù))《單例類》Singleton-instance:Singleton-Singleton()+getlnstance():Singleton《訪問類》Client#instance:Singleton軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱ISBN:978-7-115-47788-2.2單例

(Singleton)

模式(續(xù))·第1種:懶漢式單例該模式的特點(diǎn)是類加載時沒有生成單例,只有當(dāng)?shù)谝淮握{(diào)用getlnstance

方法

時才去創(chuàng)建這個單例。代碼如下:publicclass

LazySingleton{pr

ivate

static

volatile

LazySingleton

instance=null;//保

證instance在所有線程中同步privateLazySingleton(){}//private避免類在外部被實(shí)例化publicstatic

synchronizedLazySingletongetInstance(){

//getInstance

方法前加同步if(instance==null){instance=newLazySingleton();}returninstance;軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱ISBN:978-7-115-47788-2.2單例

(Singleton)

模式(續(xù))·第2種:餓漢式單例該模式的特點(diǎn)是類一旦加載就創(chuàng)建一個單例,保證在調(diào)用getlnstance

方法之

前單例已經(jīng)存在了。public

class

HungrySingleton{privatestaticfinalHungrySingletoninstance=newHungrySingleton();privateHungrySingleton(){}public

static

HungrySingleton

getlnstance(){returninstance;軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

教學(xué)資源網(wǎng)址:·2.2.3模式的應(yīng)用實(shí)例【例2.1】

用懶漢式單例模式模擬華強(qiáng)智能有限公司的工會組織的成立。分析:

因?yàn)橐粋€公司

的工會組織只要求一個,

所以可以用單例模式來實(shí)

現(xiàn),右邊是用懶漢式單例

實(shí)現(xiàn)的結(jié)構(gòu)圖:public

static

synchronized

TradeUnion

getlnstance(Kif(instance==null){instance=new

TradeUnion();//創(chuàng)建實(shí)例}else{System.out.println("

工會組織已經(jīng)成立,不需要重復(fù)創(chuàng)建。");return

instance;軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

教學(xué)資源網(wǎng)址:2.2單例

(Singleton)

模式(續(xù))單例類TradeUnion-instance:TradeUnion-TradeUnion()+getlnstance():TradeUnion訪問類n201SingletonLazy+main(String[]args):void注:程序代碼見附件。2.2單例

(Singleton)

模式(續(xù))·2.2.3模式的應(yīng)用實(shí)例

JPanel【例2.2】

用餓漢式單例模式模擬資源管理器的創(chuàng)

。分析:一個軟件系統(tǒng)的資源管理器通常只需創(chuàng)建

一個,所以本實(shí)例同樣適

合用單例模式實(shí)現(xiàn),右邊

是用餓漢式單例實(shí)現(xiàn)的結(jié)

構(gòu)

:單例類ResourceManager-instance:ResourceManager=new

ResourceManager();-ResourceManager()+getlnstance():ResourceManagerpublicstatic

ResourceManagergetlnstance(){訪問類n202SingletonEager+main(Stringl

args)軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

教學(xué)資源網(wǎng)址:注:程序代碼見附件。return

instance;·

2.2.3模式的應(yīng)用實(shí)例【例2

.2】

用餓漢

式單例模式模擬資

源管理器的創(chuàng)建。右邊是程序的運(yùn)行結(jié)果:資

-

Eclipse

餓漢單例模式測試文件(F)編輯(E)瀏覽(N)

搜索(A)項(xiàng)項(xiàng)目資源管理器3vDesignPatternCode√

chapter01.principle>DN102LSPtest.java>DN103DIPtest.java>DN105ISPtestjava>DN106LoDtest.java>B

chapter02.protoTypev由

chapter02.singleton>國N201SingletonLazy.j>D

N202SingletonEagerResourceManager.jp軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱

教學(xué)資源網(wǎng)址:2.2單例

(Singleton)

模式(續(xù))實(shí)例ot2.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

版)、作者:程細(xì)柱·2.2.5模式的擴(kuò)展單例模式可擴(kuò)展為有限的多例(Multiton)

模式,這種模式可生成有限

個實(shí)例并保存在ArrayList

中,客戶

需要時可隨機(jī)獲取,

其結(jié)構(gòu)圖如右:static{for(int

i=0;i<n;i++){list.add(new

Multiton(i));public

static

Multiton

getRandomlnstance(){int

value

=(int)(Math

.random()*n);return

list.get(value);2.2單例

(Singleton)

模式(續(xù))《多例類》Multiton-list:ArrayList<Multiton>;-Multiton(n:int)+getRandomlnstance():Multiton《訪問類》Client

#instance:Multiton軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱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)原型模式包含以下主要角色:(1)抽象原型類:規(guī)定了具體原型對象必須實(shí)現(xiàn)的接口。(2)

具體原型類:實(shí)現(xiàn)抽象原型類的clone方法,它可被復(fù)制。(3)

訪問者類:使用具體原型類中的clone

方法來復(fù)制新的對象。軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱2.3原型

(Prototype)

模式(續(xù))·2.3.2模式的結(jié)構(gòu)與實(shí)現(xiàn)1.模式的結(jié)構(gòu)(續(xù))其結(jié)構(gòu)圖如下:Realizetype

obj1=new

Realizetype();Realizetype

obj2=(Realizetype)obj1.clone();《具體原型類》Realizetype+clone():Realizetype《訪問類》PrototypeTest+main():voidPrototype+clone():Prototype軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱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

版)、作者:程細(xì)柱·

2.3.3模式的應(yīng)用實(shí)例【例2.3】

用原型模式模擬“孫悟空”復(fù)制自

。分析:孫悟空拔下猴毛輕輕一吹就變出很多

孫悟空,這實(shí)際上是用

到了原型模式,右邊是

其結(jié)構(gòu)圖:《原型類》SunWukongSunWukong

obj1=new

SunWukong();+SunWukong()

SunWukong

obj2=(SunWukong)obj1.clone();+clone():Object2.3原型

(Prototype)

模式(續(xù))JPanelCloneable+clone():Object《訪問類》ProtoTypewukong+main(String[]args):void注:程序代碼見附件軟件設(shè)計(jì)模式(Java

版)、作者:程細(xì)柱DProtoTypeWukong.java

×④import

java.avt.*;□classSunkukongextendsJPanelimplements

CloneableprivatestaticfinallongserialVersionUID=5543049531872119328L;

public

SunMukong()ProtoTypeCitationjava原型模式測試Ant1n(

"mngJRE

系統(tǒng)庫[JavaSE-1.6]Chapter03Sunwukong

obj1=new

SunNukong();ProtoTypeWukong

[Java應(yīng)用程序C:\ProgramFilesVavajre6\binjavaw.exe(2017-3-16下午·2.3.3模式的應(yīng)用實(shí)例【例2.3】

用原型模式模擬“孫悟空”復(fù)制

。//右邊是程序的運(yùn)行結(jié)

:2.3原型

(Prototype)

模式(續(xù))□ProtoTypeShape.java□

ProtoTypeTe

溫馨提示

  • 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

提交評論