版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高山避雷施工方案(3篇)
- 童裝十一活動策劃方案(3篇)
- 拱形鋼管施工方案(3篇)
- 水泵電氣施工方案(3篇)
- 2025年高職小學(xué)教育(教育法律法規(guī)應(yīng)用)試題及答案
- 2025年大學(xué)氫能科學(xué)與工程(氫能利用)試題及答案
- 2025年中職機(jī)電設(shè)備(機(jī)電設(shè)備安裝工藝)試題及答案
- 2025年大學(xué)本科(測繪工程技術(shù))工程測繪實(shí)操綜合測試題及答案
- 2025年大學(xué)一年級(計(jì)算機(jī)科學(xué)與技術(shù))程序設(shè)計(jì)基礎(chǔ)試題及答案
- 2025年大學(xué)服裝與服飾設(shè)計(jì)(服裝與服飾設(shè)計(jì)學(xué))試題及答案
- 藍(lán)色簡約質(zhì)量意識培訓(xùn)模板
- 2024年廣州市中考語文試卷真題(含官方答案及解析)
- 新教材高中數(shù)學(xué)第八章立體幾何初步8.4.1平面課件
- 智慧農(nóng)業(yè)中的智能灌溉技術(shù)
- 瑜伽店長培訓(xùn)方案
- 牽引供電系統(tǒng)短路計(jì)算-牽引供電系統(tǒng)短路計(jì)算(高鐵牽引供電系統(tǒng))
- 標(biāo)識牌單元工程施工質(zhì)量驗(yàn)收評定表
- QSB知識培訓(xùn)資料重點(diǎn)
- 安全庫存基準(zhǔn)表
- (37)-24.1.4黃芪中藥中醫(yī)學(xué)課件
- 刑法學(xué)(上冊)馬工程課件 第1章 刑法概說
評論
0/150
提交評論