軟件設(shè)計(jì)與體系結(jié)構(gòu)第七章軟件體系結(jié)構(gòu)分隔與設(shè)計(jì)模式_第1頁
軟件設(shè)計(jì)與體系結(jié)構(gòu)第七章軟件體系結(jié)構(gòu)分隔與設(shè)計(jì)模式_第2頁
軟件設(shè)計(jì)與體系結(jié)構(gòu)第七章軟件體系結(jié)構(gòu)分隔與設(shè)計(jì)模式_第3頁
軟件設(shè)計(jì)與體系結(jié)構(gòu)第七章軟件體系結(jié)構(gòu)分隔與設(shè)計(jì)模式_第4頁
軟件設(shè)計(jì)與體系結(jié)構(gòu)第七章軟件體系結(jié)構(gòu)分隔與設(shè)計(jì)模式_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、前言基本概念n軟件設(shè)計(jì)模式:軟件設(shè)計(jì)模式:廣義定義:可解決一類軟件問題并能重廣義定義:可解決一類軟件問題并能重復(fù)使用的軟件設(shè)計(jì)方案復(fù)使用的軟件設(shè)計(jì)方案狹義定義:設(shè)計(jì)模式是對被用來在特定狹義定義:設(shè)計(jì)模式是對被用來在特定場景下解決一般設(shè)計(jì)問題的類和相互通場景下解決一般設(shè)計(jì)問題的類和相互通信的對象的描述。是在類和對象的層次信的對象的描述。是在類和對象的層次描述的可重復(fù)使用的軟件設(shè)計(jì)問題解決描述的可重復(fù)使用的軟件設(shè)計(jì)問題解決方案。方案?;靖拍頽軟件體系結(jié)構(gòu)風(fēng)格:是在構(gòu)件和連接子的層次所描軟件體系結(jié)構(gòu)風(fēng)格:是在構(gòu)件和連接子的層次所描述的可重復(fù)使用的軟件設(shè)計(jì)問題解決方案。述的可重復(fù)使用的軟件設(shè)計(jì)問題解

2、決方案。基本概念n二者的共性和區(qū)別:二者的共性和區(qū)別:區(qū)別:區(qū)別: 1、設(shè)計(jì)模式是在類和對象的層次描述問題,、設(shè)計(jì)模式是在類和對象的層次描述問題, 粒度較??;粒度較小;2、體系結(jié)構(gòu)風(fēng)格是在構(gòu)件和連接子的層次描、體系結(jié)構(gòu)風(fēng)格是在構(gòu)件和連接子的層次描 述問題,粒度較大。體系結(jié)構(gòu)風(fēng)格是廣義述問題,粒度較大。體系結(jié)構(gòu)風(fēng)格是廣義 上的設(shè)計(jì)模式。上的設(shè)計(jì)模式。共性:都是可重復(fù)使用的軟件設(shè)計(jì)問題解決方案共性:都是可重復(fù)使用的軟件設(shè)計(jì)問題解決方案軟件體系結(jié)構(gòu)描述語言n軟件體系結(jié)構(gòu)描述語言軟件體系結(jié)構(gòu)描述語言Architectural Description Language,簡稱,簡稱ADL是用來描述軟件密集

3、型系統(tǒng)的總體結(jié)構(gòu)的語言,說明是用來描述軟件密集型系統(tǒng)的總體結(jié)構(gòu)的語言,說明系統(tǒng)眾多部件之間的結(jié)構(gòu)關(guān)系。系統(tǒng)眾多部件之間的結(jié)構(gòu)關(guān)系。n代表性的體系結(jié)構(gòu)描述語言代表性的體系結(jié)構(gòu)描述語言nWrightWrightnRapideRapidenDarwinDarwinnUniconUniconnACMEACMEnABC/ADLABC/ADLnXYZ/ADLXYZ/ADLnXADLXADL大部分結(jié)構(gòu)描述語言都有構(gòu)件、連接子、配置等概念大部分結(jié)構(gòu)描述語言都有構(gòu)件、連接子、配置等概念軟件體系結(jié)構(gòu)描述語言nWright ADL構(gòu)件(構(gòu)件(Component) 連接子(連接子(Connector) 端口(端口(P

4、orts) 構(gòu)件規(guī)范(構(gòu)件規(guī)范(Component-spec) 計(jì)算(計(jì)算(Computation) 配置(配置(Configuration) 角色(角色(Roles) 粘連(粘連(Glue) 實(shí)例(實(shí)例(Instances) 聯(lián)接(聯(lián)接(Attachments) 軟件體系結(jié)構(gòu)描述語言-Wright ADLn過程調(diào)用實(shí)例:過程調(diào)用實(shí)例: 一個(gè)一個(gè)Caller類型的構(gòu)件類型的構(gòu)件c通過通過D-C-connector類型的類型的 連連接子接子dc調(diào)用調(diào)用Definer類型的構(gòu)件類型的構(gòu)件d c 調(diào)用調(diào)用 d軟件體系結(jié)構(gòu)描述語言調(diào)用實(shí)例的調(diào)用實(shí)例的Wright體系結(jié)構(gòu)描述體系結(jié)構(gòu)描述軟件體系結(jié)構(gòu)描述

5、語言nGADL的元模型的元模型圖形化的體系結(jié)構(gòu)描述語言圖形化的體系結(jié)構(gòu)描述語言GADL軟件體系結(jié)構(gòu)描述語言圖形化的體系結(jié)構(gòu)描述語言圖形化的體系結(jié)構(gòu)描述語言GADL調(diào)用實(shí)例的調(diào)用實(shí)例的GADL體系結(jié)構(gòu)描述體系結(jié)構(gòu)描述構(gòu)件圖構(gòu)件圖構(gòu)件構(gòu)件連接子連接子端口端口角色角色軟件體系結(jié)構(gòu)描述語言調(diào)用實(shí)例的調(diào)用實(shí)例的GADL體系結(jié)構(gòu)描述體系結(jié)構(gòu)描述類圖類圖軟件體系結(jié)構(gòu)描述語言n一個(gè)圖形化的體系結(jié)構(gòu)描述語言一個(gè)圖形化的體系結(jié)構(gòu)描述語言GADL調(diào)用實(shí)例的調(diào)用實(shí)例的GADL體系結(jié)構(gòu)描述體系結(jié)構(gòu)描述協(xié)議類圖和順協(xié)議類圖和順序圖序圖軟件體系結(jié)構(gòu)描述語言nGADL語言用構(gòu)件圖、類圖、順序圖等方式描述系語言用構(gòu)件圖、類圖、

6、順序圖等方式描述系統(tǒng)的軟件體系結(jié)構(gòu),對行為的描述統(tǒng)的軟件體系結(jié)構(gòu),對行為的描述GADL用順序圖用順序圖,而,而Wright用進(jìn)行代數(shù)用進(jìn)行代數(shù)CSP。軟件體系結(jié)構(gòu)風(fēng)格n在構(gòu)件和連接子的層次上描述的可重復(fù)使用的軟在構(gòu)件和連接子的層次上描述的可重復(fù)使用的軟件設(shè)計(jì)問題解決方案。件設(shè)計(jì)問題解決方案。管道管道/過濾器風(fēng)格過濾器風(fēng)格層次風(fēng)格層次風(fēng)格客戶客戶/服務(wù)器風(fēng)格服務(wù)器風(fēng)格核心特征、應(yīng)用場景、注意的問題核心特征、應(yīng)用場景、注意的問題軟件體系結(jié)構(gòu)風(fēng)格-管道/過濾器風(fēng)格n實(shí)例剖析:實(shí)例剖析: 統(tǒng)計(jì)統(tǒng)計(jì)a.txt中單詞的個(gè)數(shù)并打印出來:中單詞的個(gè)數(shù)并打印出來:shell命令:命令:“cat a.txt |

7、wc -w | lpr” 1、cat命令輸出命令輸出a.txt的內(nèi)容的內(nèi)容2、通過管道傳給命令、通過管道傳給命令wc,統(tǒng)計(jì)輸入流中單詞的,統(tǒng)計(jì)輸入流中單詞的 個(gè)數(shù)并輸出個(gè)數(shù)并輸出3、輸出的單詞數(shù)通過管道傳給命令、輸出的單詞數(shù)通過管道傳給命令lpr,lpr將其將其 打印出來打印出來 軟件體系結(jié)構(gòu)風(fēng)格-管道/過濾器風(fēng)格n實(shí)例剖析:實(shí)例剖析:shell命令:命令:“cat a.txt | wc -w | lpr” 軟件體系結(jié)構(gòu)風(fēng)格-管道/過濾器風(fēng)格n實(shí)例剖析:實(shí)例剖析:shell命令:命令:“cat a.txt | wc -w | lpr” WriteData協(xié)議類圖和順序圖協(xié)議類圖和順序圖軟件體系

8、結(jié)構(gòu)風(fēng)格-管道/過濾器風(fēng)格n實(shí)例剖析:實(shí)例剖析:shell命令:命令:“cat a.txt | wc -w | lpr” ReadData協(xié)議類圖和順序圖協(xié)議類圖和順序圖軟件體系結(jié)構(gòu)風(fēng)格-管道/過濾器風(fēng)格n實(shí)例剖析:實(shí)例剖析: 打印打印a.txt中中soft的個(gè)數(shù)的個(gè)數(shù)“cat a.txt | grep -o soft | wc -w | lpr”構(gòu)件圖構(gòu)件圖軟件體系結(jié)構(gòu)風(fēng)格-管道/過濾器風(fēng)格n特征:系統(tǒng)中構(gòu)件之間通過數(shù)據(jù)流松散耦合。也特征:系統(tǒng)中構(gòu)件之間通過數(shù)據(jù)流松散耦合。也就是說,構(gòu)件之間的依賴僅僅是數(shù)據(jù)流,而不是就是說,構(gòu)件之間的依賴僅僅是數(shù)據(jù)流,而不是通常的接口函數(shù)調(diào)用或消息傳遞。通常

9、的接口函數(shù)調(diào)用或消息傳遞。n其他典型應(yīng)用:編譯器、信號(hào)處理等。其他典型應(yīng)用:編譯器、信號(hào)處理等。n其他說明:本模式在實(shí)現(xiàn)上可以有許多不同的變其他說明:本模式在實(shí)現(xiàn)上可以有許多不同的變化,如主動(dòng)與被動(dòng)、多出口管道等?;缰鲃?dòng)與被動(dòng)、多出口管道等。軟件體系結(jié)構(gòu)風(fēng)格-層次風(fēng)格n實(shí)例剖析:數(shù)據(jù)庫系統(tǒng)實(shí)例剖析:數(shù)據(jù)庫系統(tǒng)用戶接口(查詢、創(chuàng)建等)用戶接口(查詢、創(chuàng)建等) 數(shù)據(jù)庫管理數(shù)據(jù)庫管理數(shù)據(jù)庫文件(文件管理功能)數(shù)據(jù)庫文件(文件管理功能) 文件管理文件管理外部設(shè)備(設(shè)備管理功能)外部設(shè)備(設(shè)備管理功能) 設(shè)備管理設(shè)備管理軟件體系結(jié)構(gòu)風(fēng)格-層次風(fēng)格n實(shí)例剖析:數(shù)據(jù)庫系統(tǒng)實(shí)例剖析:數(shù)據(jù)庫系統(tǒng)數(shù)據(jù)庫服務(wù)端

10、口數(shù)據(jù)庫服務(wù)端口db軟件體系結(jié)構(gòu)風(fēng)格-層次風(fēng)格n特征:從向外提供服務(wù)的構(gòu)件出發(fā),沿著連接關(guān)特征:從向外提供服務(wù)的構(gòu)件出發(fā),沿著連接關(guān)系遞次搜索各構(gòu)件和連接子,如果形成的拓?fù)浣Y(jié)系遞次搜索各構(gòu)件和連接子,如果形成的拓?fù)浣Y(jié)構(gòu)是一個(gè)有向無圈圖(典型情況下是一個(gè)線性結(jié)構(gòu)是一個(gè)有向無圈圖(典型情況下是一個(gè)線性結(jié)構(gòu)),那么這個(gè)系統(tǒng)的體系結(jié)構(gòu)風(fēng)格就是層次式構(gòu)),那么這個(gè)系統(tǒng)的體系結(jié)構(gòu)風(fēng)格就是層次式的。的。n這種設(shè)計(jì)風(fēng)格便于將復(fù)雜的系統(tǒng)進(jìn)行分解;同時(shí)這種設(shè)計(jì)風(fēng)格便于將復(fù)雜的系統(tǒng)進(jìn)行分解;同時(shí)也便于構(gòu)件替換:只要保持接口一致,就可以將也便于構(gòu)件替換:只要保持接口一致,就可以將某一層的軟件替換掉,而不會(huì)影響到系統(tǒng)的

11、其他某一層的軟件替換掉,而不會(huì)影響到系統(tǒng)的其他部分。部分。 軟件體系結(jié)構(gòu)風(fēng)格-層次風(fēng)格n其他典型應(yīng)用:開放系統(tǒng)互聯(lián)(其他典型應(yīng)用:開放系統(tǒng)互聯(lián)(OSI)七層網(wǎng)絡(luò)模)七層網(wǎng)絡(luò)模型、型、Windows NT操作系統(tǒng)的內(nèi)核結(jié)構(gòu)。操作系統(tǒng)的內(nèi)核結(jié)構(gòu)。軟件體系結(jié)構(gòu)風(fēng)格-層次風(fēng)格軟件體系結(jié)構(gòu)風(fēng)格-層次風(fēng)格n其他說明:其他說明:優(yōu)點(diǎn)是結(jié)構(gòu)清晰、可替換性好、便于控制復(fù)雜優(yōu)點(diǎn)是結(jié)構(gòu)清晰、可替換性好、便于控制復(fù)雜性;性;但也有它的缺點(diǎn),如效率低:分層結(jié)構(gòu)中高層但也有它的缺點(diǎn),如效率低:分層結(jié)構(gòu)中高層的數(shù)據(jù)要經(jīng)過層層傳遞和轉(zhuǎn)發(fā),從而降低系統(tǒng)的數(shù)據(jù)要經(jīng)過層層傳遞和轉(zhuǎn)發(fā),從而降低系統(tǒng)效率。效率。 軟件體系結(jié)構(gòu)風(fēng)格-客戶

12、/服務(wù)器風(fēng)格n實(shí)例剖析:實(shí)例剖析:FTP系統(tǒng)系統(tǒng)軟件體系結(jié)構(gòu)風(fēng)格-客戶/服務(wù)器風(fēng)格n特征:從向外提供服務(wù)的構(gòu)件出發(fā),沿著連接關(guān)特征:從向外提供服務(wù)的構(gòu)件出發(fā),沿著連接關(guān)系遞次搜索各構(gòu)件和連接子,如果形成的拓?fù)浣Y(jié)系遞次搜索各構(gòu)件和連接子,如果形成的拓?fù)浣Y(jié)構(gòu)是一棵倒置的樹,那么這個(gè)系統(tǒng)的體系結(jié)構(gòu)就構(gòu)是一棵倒置的樹,那么這個(gè)系統(tǒng)的體系結(jié)構(gòu)就是客戶是客戶/服務(wù)器風(fēng)格的。服務(wù)器風(fēng)格的。n這種風(fēng)格使得服務(wù)功能的實(shí)現(xiàn)很集中,便于系統(tǒng)這種風(fēng)格使得服務(wù)功能的實(shí)現(xiàn)很集中,便于系統(tǒng)實(shí)現(xiàn),因而得到廣泛使用。實(shí)現(xiàn),因而得到廣泛使用。 軟件體系結(jié)構(gòu)風(fēng)格-客戶/服務(wù)器風(fēng)格n其他典型應(yīng)用:電子郵件系統(tǒng)、其他典型應(yīng)用:電子郵件

13、系統(tǒng)、WWW系統(tǒng)、系統(tǒng)、TELNET系統(tǒng)、系統(tǒng)、CVS版本控制系統(tǒng)等版本控制系統(tǒng)等軟件體系結(jié)構(gòu)風(fēng)格-客戶/服務(wù)器風(fēng)格數(shù)據(jù)庫服務(wù)器可以向多個(gè)瀏數(shù)據(jù)庫服務(wù)器可以向多個(gè)瀏覽器實(shí)例提供服務(wù)、還可以覽器實(shí)例提供服務(wù)、還可以向向CVS系統(tǒng)提供服務(wù)。系統(tǒng)提供服務(wù)。軟件體系結(jié)構(gòu)風(fēng)格-客戶/服務(wù)器風(fēng)格n其他說明:在客戶其他說明:在客戶/服務(wù)器風(fēng)格的系統(tǒng)中,服務(wù)器是資源服務(wù)器風(fēng)格的系統(tǒng)中,服務(wù)器是資源和計(jì)算的集中地,因此容易成為存儲(chǔ)和計(jì)算瓶頸,實(shí)際應(yīng)和計(jì)算的集中地,因此容易成為存儲(chǔ)和計(jì)算瓶頸,實(shí)際應(yīng)用中為了提高服務(wù)器的性能,可能要采用集群處理等辦法用中為了提高服務(wù)器的性能,可能要采用集群處理等辦法。同時(shí),這個(gè)特點(diǎn)

14、也使得這類系統(tǒng)容易遭受拒絕服務(wù)(。同時(shí),這個(gè)特點(diǎn)也使得這類系統(tǒng)容易遭受拒絕服務(wù)(Deny Of Service)攻擊,因此在設(shè)計(jì)和應(yīng)用中要作針對性)攻擊,因此在設(shè)計(jì)和應(yīng)用中要作針對性考慮。考慮。n此外,在這種風(fēng)格的系統(tǒng)中,服務(wù)器中往往要存儲(chǔ)更多客此外,在這種風(fēng)格的系統(tǒng)中,服務(wù)器中往往要存儲(chǔ)更多客戶的狀態(tài)信息,因此大量使用并發(fā)執(zhí)行技術(shù),如多進(jìn)程、戶的狀態(tài)信息,因此大量使用并發(fā)執(zhí)行技術(shù),如多進(jìn)程、多線程等,這也就涉及到進(jìn)程、線程的動(dòng)態(tài)創(chuàng)建、調(diào)度、多線程等,這也就涉及到進(jìn)程、線程的動(dòng)態(tài)創(chuàng)建、調(diào)度、刪除等問題。這些問題處理得好壞直接影響到服務(wù)器的性刪除等問題。這些問題處理得好壞直接影響到服務(wù)器的性能。

15、能。設(shè)計(jì)模式n文獻(xiàn)文獻(xiàn)7-2中描述了中描述了23個(gè)設(shè)計(jì)模式,并將它們分為個(gè)設(shè)計(jì)模式,并將它們分為三種類型:創(chuàng)建型設(shè)計(jì)模式、結(jié)構(gòu)型設(shè)計(jì)模式和三種類型:創(chuàng)建型設(shè)計(jì)模式、結(jié)構(gòu)型設(shè)計(jì)模式和行為型設(shè)計(jì)模式。行為型設(shè)計(jì)模式。 設(shè)計(jì)模式Factory MethodFactory Method(工廠方法)(工廠方法)Abstract FactoryAbstract Factory(抽象工廠)(抽象工廠)SingletonSingleton(單件)(單件)CompositeComposite(組合)(組合)ProxyProxy(代理)(代理)IteratorIterator(迭代器)(迭代器)Observer

16、Observer (觀察者)(觀察者)動(dòng)機(jī)和實(shí)例、應(yīng)用場合、結(jié)構(gòu)、核心思想動(dòng)機(jī)和實(shí)例、應(yīng)用場合、結(jié)構(gòu)、核心思想設(shè)計(jì)模式-Factory Methodn動(dòng)機(jī)與實(shí)例:動(dòng)機(jī)與實(shí)例:“龍珠龍珠”游戲游戲魔力管道:魔力管道: 彈球(彈球(pop) 制造球(制造球(Enchant)球球設(shè)計(jì)模式-Factory Methodn動(dòng)機(jī)與實(shí)例:動(dòng)機(jī)與實(shí)例:“龍珠龍珠”游戲游戲-設(shè)計(jì)設(shè)計(jì)1球有多種,如皮球、鋼球球有多種,如皮球、鋼球BallBall抽象父類抽象父類BallBall無法被實(shí)例化無法被實(shí)例化?設(shè)計(jì)模式-Factory Methodn動(dòng)機(jī)與實(shí)例:動(dòng)機(jī)與實(shí)例:“龍珠龍珠”游戲游戲-設(shè)計(jì)設(shè)計(jì)2new Ball

17、new Ball動(dòng)作包裝成虛函數(shù)動(dòng)作包裝成虛函數(shù)MakeBallFactoryMethodMakeBallFactoryMethod在子類(描述各種魔力管道)中重新定義該虛函數(shù)在子類(描述各種魔力管道)中重新定義該虛函數(shù)設(shè)計(jì)模式-Factory Methodn適用場合:有一些實(shí)體(各種魔力管道),它們適用場合:有一些實(shí)體(各種魔力管道),它們的結(jié)構(gòu)和行為是相似的,且都包含一些相似的更的結(jié)構(gòu)和行為是相似的,且都包含一些相似的更小實(shí)體(各類球),但一個(gè)大實(shí)體內(nèi)部的這些小小實(shí)體(各類球),但一個(gè)大實(shí)體內(nèi)部的這些小實(shí)體都是同一類的(一種魔力管道內(nèi)只有一種球?qū)嶓w都是同一類的(一種魔力管道內(nèi)只有一種球)。

18、此時(shí),如果各類小實(shí)體的描述構(gòu)成一個(gè)類層)。此時(shí),如果各類小實(shí)體的描述構(gòu)成一個(gè)類層次,那么可使用次,那么可使用Factory Method模式,將各類大模式,將各類大實(shí)體也描述為一個(gè)類層次。實(shí)體也描述為一個(gè)類層次。 設(shè)計(jì)模式-Factory Methodn結(jié)構(gòu):結(jié)構(gòu):設(shè)計(jì)模式-Factory Methodn核心思想歸納:在父類中,將創(chuàng)建對象的操作包核心思想歸納:在父類中,將創(chuàng)建對象的操作包裝為一個(gè)虛函數(shù),在描述公共行為的過程中調(diào)用裝為一個(gè)虛函數(shù),在描述公共行為的過程中調(diào)用該函數(shù);在子類中重定義該虛函數(shù)來定制創(chuàng)建的該函數(shù);在子類中重定義該虛函數(shù)來定制創(chuàng)建的對象,從而間接定制公共行為。利用虛函數(shù)的多

19、對象,從而間接定制公共行為。利用虛函數(shù)的多態(tài)機(jī)制,態(tài)機(jī)制,F(xiàn)actory Method模式使得父類可集中描模式使得父類可集中描述公共行為,而將特別行為(不同對象的創(chuàng)建)述公共行為,而將特別行為(不同對象的創(chuàng)建)抽放于子類。抽放于子類。設(shè)計(jì)模式-Abstract Factoryn動(dòng)機(jī)與實(shí)例:魔力管道。動(dòng)機(jī)與實(shí)例:魔力管道。 在前面的設(shè)計(jì)中,三個(gè)在前面的設(shè)計(jì)中,三個(gè)MakeBallFactoryMethod工工廠方法散放在三個(gè)廠方法散放在三個(gè)MagicPipe類中。為了降低復(fù)雜類中。為了降低復(fù)雜性,可以把所有的創(chuàng)建動(dòng)作拆分出來單獨(dú)考慮。性,可以把所有的創(chuàng)建動(dòng)作拆分出來單獨(dú)考慮。 即:創(chuàng)建球的動(dòng)作單

20、獨(dú)形成一個(gè)工廠類,專門創(chuàng)建即:創(chuàng)建球的動(dòng)作單獨(dú)形成一個(gè)工廠類,專門創(chuàng)建對象。對象。設(shè)計(jì)模式-Abstract Factoryn動(dòng)機(jī)與實(shí)例:設(shè)計(jì)動(dòng)機(jī)與實(shí)例:設(shè)計(jì)3設(shè)計(jì)模式-Abstract Factoryn動(dòng)機(jī)與實(shí)例:設(shè)計(jì)動(dòng)機(jī)與實(shí)例:設(shè)計(jì)4不僅有球、還有盒子等小實(shí)體,不僅有球、還有盒子等小實(shí)體,抽象工廠類專門創(chuàng)建各種小實(shí)體抽象工廠類專門創(chuàng)建各種小實(shí)體設(shè)計(jì)模式-Abstract Factoryn動(dòng)機(jī)與實(shí)例:設(shè)計(jì)動(dòng)機(jī)與實(shí)例:設(shè)計(jì)5混合管道和小實(shí)體混合管道和小實(shí)體設(shè)計(jì)模式-Abstract Factoryn適用場合:當(dāng)需要?jiǎng)?chuàng)建一組多種風(fēng)格的小實(shí)體、適用場合:當(dāng)需要?jiǎng)?chuàng)建一組多種風(fēng)格的小實(shí)體、且具體創(chuàng)建方

21、式又要靈活可調(diào)整時(shí),可使用且具體創(chuàng)建方式又要靈活可調(diào)整時(shí),可使用Abstract Factory模式,將公共的創(chuàng)建行為描述為模式,將公共的創(chuàng)建行為描述為一個(gè)抽象類,而將具體的創(chuàng)建方式用該抽象類的一個(gè)抽象類,而將具體的創(chuàng)建方式用該抽象類的子類來描述。子類來描述。設(shè)計(jì)模式-Abstract Factoryn結(jié)構(gòu):結(jié)構(gòu):設(shè)計(jì)模式-Abstract Factoryn核心思想歸納:為了提供靈活性,將需要?jiǎng)?chuàng)建的核心思想歸納:為了提供靈活性,將需要?jiǎng)?chuàng)建的同一風(fēng)格的一組小實(shí)體的一般特征提取出來,用同一風(fēng)格的一組小實(shí)體的一般特征提取出來,用一組抽象產(chǎn)品類來描述,同時(shí)將創(chuàng)建行為封裝為一組抽象產(chǎn)品類來描述,同時(shí)將創(chuàng)

22、建行為封裝為一個(gè)抽象工廠類,提供通用的創(chuàng)建接口,而將各一個(gè)抽象工廠類,提供通用的創(chuàng)建接口,而將各種具體的產(chǎn)品和具體的創(chuàng)建行為用抽象產(chǎn)品類和種具體的產(chǎn)品和具體的創(chuàng)建行為用抽象產(chǎn)品類和抽象工廠類的子類來描述。從而使得抽象工廠類的子類來描述。從而使得BigEntity和和具體的產(chǎn)品特性和具體的創(chuàng)建行為隔離開來,既具體的產(chǎn)品特性和具體的創(chuàng)建行為隔離開來,既降低了耦合度,也使得靈活調(diào)整創(chuàng)建行為成為可降低了耦合度,也使得靈活調(diào)整創(chuàng)建行為成為可能。能。 設(shè)計(jì)模式-Singletonn動(dòng)機(jī)與實(shí)例:日志功能,在一個(gè)應(yīng)用程序內(nèi)部一動(dòng)機(jī)與實(shí)例:日志功能,在一個(gè)應(yīng)用程序內(nèi)部一般只需要一個(gè)日志實(shí)例即可。般只需要一個(gè)日志

23、實(shí)例即可。實(shí)現(xiàn)方案實(shí)現(xiàn)方案1公有的構(gòu)造函數(shù)公有的構(gòu)造函數(shù)/log.h#include #include class Log public: Log(); void Print(LPSTR format, .); void SetFile(LPSTR filename); virtual Log();private:設(shè)計(jì)模式-Singleton實(shí)現(xiàn)方案1全局變量全局變量設(shè)計(jì)模式-Singleton 實(shí)現(xiàn)方案1需要日志的地方直接使用變量需要日志的地方直接使用變量g_log和相關(guān)接口函數(shù)和相關(guān)接口函數(shù)/main.cpp#include log.hvoid main() g_log.SetFile(

24、myapp.log ); g_log.Print(App starts.); .設(shè)計(jì)模式-Singleton 實(shí)現(xiàn)方案1:兩個(gè)缺陷一般情況下(如果只有一個(gè)日志文件)只需要一個(gè)Log實(shí)例即可,但上述做法不能保證Log的實(shí)例只有一個(gè),當(dāng)多個(gè)實(shí)例設(shè)置相同的日志文件的時(shí)候,還可能引起沖突;這種做法使得g_log無論用到與否都要被創(chuàng)建。設(shè)計(jì)模式-Singleton 實(shí)現(xiàn)方案2:使用Singleton模式私有靜態(tài)成員變量,私有靜態(tài)成員變量,代替全局變量,指向代替全局變量,指向log唯一實(shí)例唯一實(shí)例構(gòu)造函數(shù)變?yōu)闃?gòu)造函數(shù)變?yōu)閜rotected不可能在類外部創(chuàng)建實(shí)例不可能在類外部創(chuàng)建實(shí)例靜態(tài)私有函數(shù)代替全局變量

25、,靜態(tài)私有函數(shù)代替全局變量,獲取實(shí)例指針獲取實(shí)例指針設(shè)計(jì)模式-Singleton 實(shí)現(xiàn)方案2:使用Singleton模式#include “l(fā)og.h”Log *log:theOnlyInstance=0;Log *Log:getInstance()If (! theOnlyInstance)theOnlyInstance=new Log();Return theOnlyInstance;初始化為初始化為0靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)getInstance返回返回theOnlyInstance的值的值設(shè)計(jì)模式-Singleton 實(shí)現(xiàn)方案2:使用Singleton模式#include “l(fā)og.h

26、”Void main()Log *plog=Log:getInstance();需要日志時(shí),需要日志時(shí),調(diào)用靜態(tài)成員函數(shù)調(diào)用靜態(tài)成員函數(shù)getInstance值值設(shè)計(jì)模式-Singleton 適用場合:當(dāng)需要確保一個(gè)類最多只有一個(gè)實(shí)例時(shí),使用本模式。設(shè)計(jì)模式-Singleton 結(jié)構(gòu):設(shè)需要保證只有一個(gè)實(shí)例的類為Singleton,則類Singleton的定義為:設(shè)計(jì)模式-Singleton 結(jié)構(gòu):類Singleton的實(shí)現(xiàn)為:設(shè)計(jì)模式-Singleton 核心思想歸納:通過將一個(gè)類的構(gòu)造函數(shù)設(shè)置為protected或private,可有效阻止從外部直接創(chuàng)建該類的實(shí)例;同時(shí)設(shè)置一個(gè)靜態(tài)成員函數(shù)

27、,以負(fù)責(zé)創(chuàng)建唯一的實(shí)例并向外提供訪問接口。設(shè)計(jì)模式-Composite 動(dòng)機(jī)與實(shí)例:幻燈片制作軟件。一張幻燈片上可以有各種圖元對象:文本框、圖形、圖像、影片、聲音等等。圖元具有“遞歸組合”特性。設(shè)計(jì)模式-Composite 適用場合:當(dāng)需要描述的對象具有“遞歸組合”特征、且希望用戶忽略基本對象與組合對象的區(qū)別時(shí),適用本模式。 結(jié)構(gòu):設(shè)計(jì)模式-Composite 核心思想歸納:為基本對象和組合對象提供一個(gè)公共的抽象父類,以表示所有對象,并建立起從該抽象父類到組合對象類的聚集關(guān)聯(lián),從而間接建立起“遞歸組合”特性。設(shè)計(jì)模式-Proxy 動(dòng)機(jī)與實(shí)例:網(wǎng)絡(luò)中間件。在這類程序中,實(shí)際工作的對象可能運(yùn)行在遠(yuǎn)

28、程的主機(jī)上,與客戶端應(yīng)用分別處于不同的地址空間。為了編程方便,在其中大量地使用了Proxy模式。建立一個(gè)Proxy對象:它與Server對象的接口是一樣的,而且與Client對象位于同一臺(tái)機(jī)器、同一地址空間中,所有發(fā)給它的操作請求最終都轉(zhuǎn)發(fā)Server對象。給使Client對象的設(shè)計(jì)開發(fā)變得簡單,就像本地編程一樣,網(wǎng)絡(luò)交互的許多細(xì)節(jié)則集中到Proxy對象的實(shí)現(xiàn)中。設(shè)計(jì)模式-Proxy適用場合:前面的例子中使用Proxy模式是為了屏蔽網(wǎng)絡(luò)交互細(xì)節(jié)、透明進(jìn)行遠(yuǎn)程訪問,因此屬于“遠(yuǎn)程代理”;還有一些場合是為了提高性能、降低開銷,而設(shè)置一個(gè)“虛代理”,如文檔文件中的圖像代理,它只描述圖像的位置、大小等

29、基本信息,具體圖像文件細(xì)節(jié)僅在需要時(shí)再創(chuàng)建一個(gè)真正的圖像對象來描述;另外,當(dāng)被訪問對象的內(nèi)部結(jié)構(gòu)很復(fù)雜且需要進(jìn)行智能的分析、決策和協(xié)調(diào)時(shí),可使用“智能代理”來屏蔽這些智能決策的細(xì)節(jié),如一個(gè)“訂票”代理就是如此:它可根據(jù)多家航空公司的訂票服務(wù),智能選擇一種符合用戶要求的訂票方案。 設(shè)計(jì)模式-Proxy 結(jié)構(gòu)設(shè)計(jì)模式-Proxy核心思想歸納:構(gòu)造一個(gè)具有相同接口的代理對象,然后將操作請求轉(zhuǎn)發(fā)給真實(shí)對象,其目的是向客戶隱藏“轉(zhuǎn)發(fā)過程”的細(xì)節(jié)(如遠(yuǎn)程網(wǎng)絡(luò)交互、智能決策、選擇性轉(zhuǎn)發(fā)等),提供對真實(shí)對象的透明訪問。設(shè)計(jì)模式-Iterator 動(dòng)機(jī)與實(shí)例:支持遍歷的列表設(shè)計(jì)。 設(shè)計(jì)方案1內(nèi)部迭代外部迭代vo

30、id PrintList(List * pList) for (pList-First(); !pList-IsDone(); pList-Next() pList-CurrentItem()-Print();設(shè)計(jì)模式-Iterator動(dòng)機(jī)與實(shí)例:支持遍歷的列表設(shè)計(jì)。設(shè)計(jì)方案1的問題:其一,這種設(shè)計(jì)只能描述一種遍歷方式,如向前遍歷或向后遍歷,但不能同時(shí)描述多種遍歷方式?;蛟S,大家覺得只需要再向List里面增加一些表示遍歷的接口函數(shù)和表示位置的成員變量即可,但這樣一來眾多關(guān)系不緊密的功能混放在一個(gè)類里,會(huì)使得內(nèi)聚程度變低,容易導(dǎo)致類膨脹,同時(shí)也給函數(shù)命名等帶來不便。其二,這種設(shè)計(jì)不支持在一個(gè)列表

31、上同時(shí)進(jìn)行多個(gè)相同類型的遍歷(如都是向后遍歷,只是對元素的處理方式不同),而這種情況可能出現(xiàn)在并行程序中。 設(shè)計(jì)模式-Iterator 設(shè)計(jì)方案2: 在一個(gè)列表上同時(shí)進(jìn)行多個(gè)相同類型的遍歷。 使用Iterator模式,將負(fù)責(zé)遍歷的部分功能從List中分離出來,單獨(dú)形成一個(gè)類ListIterator設(shè)計(jì)模式-Iterator 設(shè)計(jì)方案2:在一個(gè)列表上同時(shí)進(jìn)行多個(gè)相同類型的遍歷Class ListIteratorPrivate:const List *list;ListIterator增加指向原列增加指向原列表的指針。因此,一個(gè)表的指針。因此,一個(gè)ListIterator實(shí)例記錄了與實(shí)例記錄了與列

32、表的一次遍歷相關(guān)的列表的一次遍歷相關(guān)的所有信息,通過定義所有信息,通過定義ListIterator的多個(gè)實(shí)例變的多個(gè)實(shí)例變量,就可以在一個(gè)列表量,就可以在一個(gè)列表上同時(shí)進(jìn)行多個(gè)相同類上同時(shí)進(jìn)行多個(gè)相同類型的遍歷。型的遍歷。設(shè)計(jì)模式-Iterator 設(shè)計(jì)方案3: 以多種方式遍歷一個(gè)列表,再定義一個(gè)迭代器類型List * aList;.ListIterator forward(aList);ReverseListIterator backward(aList);for (forward.First(); ! forward.IsDone(); forward.Next() forward.Cur

33、rentItem()-Print();for (backward.First(); ! backward.IsDone(); backward.Next() backward.CurrentItem()-Print();設(shè)計(jì)模式-Iterator 適用場合:當(dāng)需要以多種方式靈活地遍歷一個(gè)聚合對象中的各個(gè)元素時(shí),適用本模式。 結(jié)構(gòu):設(shè)計(jì)模式-Iterator 核心思想歸納:通過將與遍歷有關(guān)的部分從聚合對象的描述中分離出來、單獨(dú)成類,能夠?qū)⒈闅v的狀態(tài)信息用一個(gè)獨(dú)立對象記錄,從而可有效處理多種遍歷和并發(fā)遍歷。另外,本模式可與Factory Method模式配合使用,支持從聚合對象直接創(chuàng)建相應(yīng)的聚合器

34、。設(shè)計(jì)模式-Observer 動(dòng)機(jī)與實(shí)例:Word軟件的“窗口拆分”功能。設(shè)計(jì)模式-Observer 動(dòng)機(jī)與實(shí)例:Word軟件的“窗口拆分”功能。設(shè)計(jì)模式-Observer 動(dòng)機(jī)與實(shí)例:Word軟件的“窗口拆分”功能。設(shè)計(jì)模式-Observer 動(dòng)機(jī)與實(shí)例:Word軟件的“窗口拆分”功能。class Document;class Window public: void Update(); Window (Document * d) doc = d; doc-Attach(this); Window () doc-Detach(this); private: void ModifyData();設(shè)計(jì)模式-Observer適用場合:如果對象之間存在一對多的數(shù)據(jù)依賴關(guān)系、且當(dāng)被依賴對象的數(shù)據(jù)改變時(shí)所有依賴于它的對象都應(yīng)得到通知并自動(dòng)更新,那么可使用本模式。被依賴的對象稱為發(fā)布者,負(fù)責(zé)發(fā)布數(shù)據(jù)并通知所有的訂閱者(即依賴于該發(fā)布者的對象),以便訂閱者與發(fā)布者的狀態(tài)保持一致。前面的例子中,Document對象為發(fā)布者,而Window對象為訂閱者。因此,本模式也稱為發(fā)布-訂閱(Publish-Subscrib

溫馨提示

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

評論

0/150

提交評論