面向?qū)ο笙到y(tǒng)設(shè)計(jì)_第1頁
面向?qū)ο笙到y(tǒng)設(shè)計(jì)_第2頁
面向?qū)ο笙到y(tǒng)設(shè)計(jì)_第3頁
面向?qū)ο笙到y(tǒng)設(shè)計(jì)_第4頁
面向?qū)ο笙到y(tǒng)設(shè)計(jì)_第5頁
已閱讀5頁,還剩149頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

關(guān)于面向?qū)ο笙到y(tǒng)設(shè)計(jì)本章主要內(nèi)容11.1軟件架構(gòu)的設(shè)計(jì)11.2高層結(jié)構(gòu)設(shè)計(jì)11.3面向?qū)ο笤O(shè)計(jì)方法11.4對象持久化與數(shù)據(jù)庫11.5設(shè)計(jì)原則11.6設(shè)計(jì)模式第2頁,共154頁,星期六,2024年,5月11.1軟件架構(gòu)的設(shè)計(jì)11.1.1什么是軟件架構(gòu)11.1.2多層應(yīng)用架構(gòu)設(shè)計(jì)11.1.3軟件框架第3頁,共154頁,星期六,2024年,5月1.架構(gòu)的概念建筑、文學(xué)、音樂、機(jī)械、電子、計(jì)算機(jī)軟硬件等領(lǐng)域都會(huì)使用“架構(gòu)(architecture)”這一概念。架構(gòu)都提供了系統(tǒng)最高層的設(shè)計(jì)方案,以確保建筑、小說、樂曲、設(shè)備、計(jì)算機(jī)等系統(tǒng)滿足期望的特性。好的建筑應(yīng)該美觀、堅(jiān)固、實(shí)用好的計(jì)算機(jī)應(yīng)用系統(tǒng)應(yīng)該實(shí)用、好維護(hù)、可靠、性價(jià)比高架構(gòu)師(architect)需要發(fā)現(xiàn)特定系統(tǒng)的最重要的關(guān)注點(diǎn),設(shè)計(jì)某種折衷的總體方案以滿足關(guān)注點(diǎn)。架構(gòu)包含系統(tǒng)的一組基本結(jié)構(gòu)(structure),每種結(jié)構(gòu)都有各種類型的部件(component)及其關(guān)系構(gòu)成,架構(gòu)描述了這些部件的組合、相互調(diào)用參照、通信以及其他動(dòng)態(tài)交互。第4頁,共154頁,星期六,2024年,5月架構(gòu)和結(jié)構(gòu)的關(guān)系架構(gòu)是抽象無形的,體現(xiàn)高層全局的決策,就像文章的中心思想和提綱。結(jié)構(gòu)是具體有形的,體現(xiàn)決策的貫徹,如同文章的每個(gè)段落及細(xì)節(jié)描述。架構(gòu)包含了結(jié)構(gòu)的初步描述和決策。相同架構(gòu)的系統(tǒng),具體結(jié)構(gòu)允許有差異。第5頁,共154頁,星期六,2024年,5月使用橋梁來比喻橋梁的架構(gòu)設(shè)計(jì)可以使用草圖描述,架構(gòu)決定了橋梁的基本結(jié)構(gòu)部件。橋梁有梁式橋、拱橋、斜拉橋、懸索橋等架構(gòu)斜拉橋的基本結(jié)構(gòu):索塔主梁斜拉索第6頁,共154頁,星期六,2024年,5月使用橋梁來比喻橋梁的結(jié)構(gòu)設(shè)計(jì)則需要考慮各種部件的數(shù)量、材料、重量、形態(tài)等方面,是可以施工的嚴(yán)謹(jǐn)?shù)慕Y(jié)構(gòu)圖。架構(gòu)是抽象的,對結(jié)構(gòu)進(jìn)行了設(shè)計(jì)和限定,每座橋的結(jié)構(gòu)是具體有形的、元素組合千變?nèi)f化第7頁,共154頁,星期六,2024年,5月2.軟件架構(gòu)軟件架構(gòu)(softwarearchitecture)的定義沒有統(tǒng)一的版本,一般認(rèn)為:一個(gè)應(yīng)用程序或計(jì)算系統(tǒng)的軟件架構(gòu)是一個(gè)或一組結(jié)構(gòu),它包含組成系統(tǒng)的軟件元素、這些元素對外可見的性質(zhì)以及它們之間的關(guān)系。對外可見的性質(zhì)指軟件元素能夠提供的服務(wù)、性能特征、錯(cuò)誤處理、共享資源的用法等。軟件的一個(gè)結(jié)構(gòu)元素可能是一個(gè)子系統(tǒng)、構(gòu)件、進(jìn)程、庫、數(shù)據(jù)庫、計(jì)算結(jié)點(diǎn)、遺留系統(tǒng)等等。軟件架構(gòu)是最高層次的系統(tǒng)分解,它不會(huì)囊括所有的結(jié)構(gòu)和行為的定義,它只關(guān)注那些被認(rèn)為是重要的元素。架構(gòu)難以更改,一旦修改,意味著整個(gè)系統(tǒng)重建,而結(jié)構(gòu)修改只影響局部。第8頁,共154頁,星期六,2024年,5月3.軟件架構(gòu)模式大部分的架構(gòu)來源于有相似關(guān)注點(diǎn)的系統(tǒng)的總結(jié)和抽象,這些相似性被描述成某種特殊模式的架構(gòu)風(fēng)格,也就是架構(gòu)模式(architecturalpattern)。一種架構(gòu)模式就是一個(gè)經(jīng)驗(yàn)秘籍,架構(gòu)師在設(shè)計(jì)不同系統(tǒng)時(shí)可以重復(fù)使用這些先進(jìn)經(jīng)驗(yàn)。圖10.1就是橋梁的四種常用架構(gòu)模式。中國建筑有一種攢尖模式,被廣泛應(yīng)用在古典園林中,如三角、四角、五角、八角等亭子,宮殿、壇廟大量應(yīng)用。第9頁,共154頁,星期六,2024年,5月軟件架構(gòu)模式軟件架構(gòu)模式就是可重復(fù)使用的軟件結(jié)構(gòu)風(fēng)格。第10頁,共154頁,星期六,2024年,5月10.1.2多層應(yīng)用架構(gòu)模式分層的含義三層多層MVC架構(gòu)模式多層的物理配置第11頁,共154頁,星期六,2024年,5月1.分層的含義基于組件的軟件開發(fā),組件根據(jù)橫向位置劃分為多層(N-Layer):下層組件負(fù)責(zé)對上層組件提供服務(wù)上層組件可以使用下層組件定義的服務(wù),但下層組件對上層組件一無所知。層與層之間通常是不透明的,每一層都具有獨(dú)立的職責(zé)不同層的軟件構(gòu)件可以分布在多臺(tái)機(jī)器上,也可以部署在同一臺(tái)機(jī)器上,形成物理上的多層(N-Tier)第12頁,共154頁,星期六,2024年,5月理解分層概念層次模型的理念就是將整個(gè)任務(wù)橫向劃分為不同級別,而不是縱向比如學(xué)校管理縱向劃分有教學(xué)、人事、財(cái)務(wù)、后勤等任務(wù)橫向劃分有主管校長(高層)、部門領(lǐng)導(dǎo)(中層)、普通員工(基層),或處、科、室計(jì)算機(jī)程序的組織結(jié)構(gòu)也可以有縱向劃分和橫向劃分縱向:教師管理功能、學(xué)生管理功能、課程管理功能……橫向:界面窗體、業(yè)務(wù)邏輯類、數(shù)據(jù)訪問類……第13頁,共154頁,星期六,2024年,5月理解分層概念自從C/S出現(xiàn)之后,軟件就被分層了:Client端的軟件完成前臺(tái)任務(wù),Server端的軟件完成后臺(tái)任務(wù)(一般是DBServer);Client使用Server端的服務(wù),依賴于Server端。自從Internet出現(xiàn)之后,軟件進(jìn)一步分層:Client端的軟件(IE瀏覽器)完成輸入輸出任務(wù),WebServer上的程序提供業(yè)務(wù)邏輯處理,后臺(tái)DBServer完成數(shù)據(jù)的存取。C/S常被稱為傳統(tǒng)的兩層,B/S稱為三層。本書的分層將不包含有關(guān)系統(tǒng)軟件(屏蔽如IE、DBMS等內(nèi)容),僅討論應(yīng)用系統(tǒng)本身的設(shè)計(jì),即應(yīng)用架構(gòu)設(shè)計(jì)。第14頁,共154頁,星期六,2024年,5月2.三個(gè)基本層次應(yīng)用軟件內(nèi)部也可以進(jìn)行多層的劃分。比如一個(gè)用戶注冊程序可以劃分為兩層:Register.aspx/Register.aspx.cs窗體:負(fù)責(zé)界面數(shù)據(jù)的輸入和格式檢驗(yàn),結(jié)果的輸出等。Person類:負(fù)責(zé)數(shù)據(jù)庫訪問和注冊規(guī)則檢查等。從應(yīng)用層面上看,如果整個(gè)應(yīng)用軟件都是采用這種方式編程(如訂單處理由PlaceOrder.aspx窗體負(fù)責(zé)界面交互,由Order、Product等類負(fù)責(zé)數(shù)據(jù)庫訪問和訂單金額計(jì)算等業(yè)務(wù)邏輯處理),那么稱之為兩層的應(yīng)用架構(gòu)??梢杂袃蓪印⑷龑?、四層等不同分層模式。Register.aspx/Register.aspx.cs窗體PersonBll類:負(fù)責(zé)注冊規(guī)則檢查等業(yè)務(wù)邏輯。PersonDal類:負(fù)責(zé)數(shù)據(jù)庫訪問。第15頁,共154頁,星期六,2024年,5月傳統(tǒng)的C/S應(yīng)用程序界面窗口程序中包含所有的內(nèi)容,如輸入輸出、界面邏輯控制、業(yè)務(wù)邏輯運(yùn)算等。系統(tǒng)架構(gòu)是兩層,應(yīng)用架構(gòu)沒有分層。數(shù)據(jù)庫第16頁,共154頁,星期六,2024年,5月經(jīng)典的三層架構(gòu)數(shù)據(jù)庫借還書組件讀者管理組件表示層(UI)業(yè)務(wù)邏輯層(BLL)數(shù)據(jù)訪問層(DAL)數(shù)據(jù)庫訪問組件第17頁,共154頁,星期六,2024年,5月經(jīng)典的三層架構(gòu)表現(xiàn)層:處理用戶和信息系統(tǒng)之間的交互。可以是簡單的命令行窗口,也可以功能完善的圖形用戶界面(胖客戶端程序),如基于HTML的瀏覽器界面(瘦客戶端程序),也可以是手機(jī)界面。業(yè)務(wù)邏輯層:也稱為領(lǐng)域?qū)踊驊?yīng)用層,是信息系統(tǒng)所有和領(lǐng)域相關(guān)的工作。如根據(jù)輸入數(shù)據(jù)或已有數(shù)據(jù)進(jìn)行計(jì)算,可以是類庫或Web服務(wù)。依賴于數(shù)據(jù)訪問層獲取數(shù)據(jù)或保存數(shù)據(jù)。數(shù)據(jù)訪問層:一般指與數(shù)據(jù)庫的交互,主要責(zé)任是數(shù)據(jù)庫記錄的存取。如組件中包含專門的數(shù)據(jù)訪問類,或每個(gè)表對應(yīng)一個(gè)數(shù)據(jù)訪問類第18頁,共154頁,星期六,2024年,5月3.擴(kuò)展的五層架構(gòu)表現(xiàn)層:等同于三層中的表現(xiàn)層??刂茖?中介層:是表現(xiàn)層和領(lǐng)域?qū)拥闹薪閷?,也稱應(yīng)用控制器。主要表示業(yè)務(wù)邏輯中的工作流,一般針對于用例的事件流控制。此外還負(fù)責(zé)會(huì)話狀態(tài)、數(shù)據(jù)的合成或分解等事務(wù)。領(lǐng)域?qū)樱簶I(yè)務(wù)邏輯中的領(lǐng)域類的集合,不包含復(fù)雜工作流。數(shù)據(jù)映射層:負(fù)責(zé)將基于對象的領(lǐng)域?qū)訑?shù)據(jù)映射到數(shù)據(jù)庫關(guān)系表中的記錄。也稱為數(shù)據(jù)持久層,可自行開發(fā)或采用持久化框架。數(shù)據(jù)訪問層:負(fù)責(zé)數(shù)據(jù)庫表的增刪改查等操作。持久化框架中包含該層組件。第19頁,共154頁,星期六,2024年,5月4.MVC架構(gòu)模式模型(Model)代表數(shù)據(jù),使用對象及其屬性實(shí)現(xiàn)??刂破鳎–ontroller)是模型與視圖的聯(lián)系紐帶,客戶的請求由控制器處理,它根據(jù)客戶的請求調(diào)用模型的方法,完成數(shù)據(jù)更新,然后調(diào)用視圖的方法將響應(yīng)結(jié)果展示給客戶。相應(yīng)的,模型的更新與修改將通過控制器通知視圖,保持視圖與模型的一致性視圖(View)是模型的外在表現(xiàn)形式,視圖可以直接訪問模型;查詢數(shù)據(jù)信息,當(dāng)模型中數(shù)據(jù)發(fā)生變化時(shí),它會(huì)通知視圖刷新界面,顯示更新后的數(shù)據(jù)。第20頁,共154頁,星期六,2024年,5月MVC架構(gòu)示意圖MVC模式和三層模式有共同特點(diǎn)(業(yè)務(wù)邏輯、數(shù)據(jù)和表示的分離),但不完全遵守分層約定。第21頁,共154頁,星期六,2024年,5月MVC架構(gòu)模式工作流程控制器對象負(fù)責(zé)頁面轉(zhuǎn)向,并傳遞頁面數(shù)據(jù)第22頁,共154頁,星期六,2024年,5月5.多層的物理配置由于應(yīng)用軟件封裝成不同層次的獨(dú)立組件,這給軟件部署帶來了靈活性:物理一層:所有應(yīng)用軟件的組件都安裝配置在一臺(tái)機(jī)器上。比如全部Web程序、DBMS都在Web服務(wù)器上。物理兩層:應(yīng)用軟件的組件配置在兩臺(tái)機(jī)器上,比如一部分安裝在客戶端,另一部分配置在應(yīng)用服務(wù)器上。物理多層:客戶端、一臺(tái)或多臺(tái)應(yīng)用服務(wù)器、數(shù)據(jù)庫服務(wù)器,即多臺(tái)服務(wù)器的方式,這是分布式結(jié)構(gòu)的一種形式。第23頁,共154頁,星期六,2024年,5月多層體系結(jié)構(gòu)的優(yōu)勢客戶對數(shù)據(jù)的訪問通過中間層進(jìn)行了隔離,數(shù)據(jù)庫的安全性提高了。應(yīng)用程序分布部署在多個(gè)物理節(jié)點(diǎn)上成為可能,從而增強(qiáng)了處理大量的用戶負(fù)載或計(jì)算任務(wù)的能力,系統(tǒng)可靠性和響應(yīng)速度得到了提高。業(yè)務(wù)邏輯處于不同的中間服務(wù)器,當(dāng)業(yè)務(wù)規(guī)則變化后,客戶端程序基本不做改動(dòng),當(dāng)組件接口不變時(shí),某一層的改動(dòng)不會(huì)影響其它層,這也意味著更好的重用和可維護(hù)性(如從窗口界面變更到Web界面)。將不同層的開發(fā)任務(wù)在開發(fā)者之間適當(dāng)?shù)胤峙洌ㄈ缫恍┤藢W㈨撁姹憩F(xiàn),另一些人專注于業(yè)務(wù)邏輯),有效地利用開發(fā)人員的專長和開發(fā)技巧,并且能夠提高并行開發(fā)能力。第24頁,共154頁,星期六,2024年,5月11.1.3軟件框架“不要重復(fù)發(fā)明輪子”軟件復(fù)用:從代碼角度(開發(fā)態(tài))看有子過程、函數(shù)、類等從部署角度(運(yùn)行態(tài))看有類庫、Web服務(wù)等二進(jìn)制可執(zhí)行組件、中間件和平臺(tái)架構(gòu)模式同樣可以復(fù)用,當(dāng)架構(gòu)模式的復(fù)用形式不僅僅停留在邏輯層面,而以物理的二進(jìn)制組件的方式提供重用時(shí),就產(chǎn)生了框架。第25頁,共154頁,星期六,2024年,5月1.軟件框架的概念軟件框架(softwareframework)是對整個(gè)或部分系統(tǒng)可重用的設(shè)計(jì)和實(shí)現(xiàn)。框架可以選擇對某種架構(gòu)模式的基本結(jié)構(gòu)和接口機(jī)制進(jìn)行編程實(shí)現(xiàn),不僅封裝該架構(gòu)模式的基本元素對外提供類庫,還封裝底層公用的流程控制邏輯,從而直接為應(yīng)用軟件提供了最初的骨架??蚣芫褪且粋€(gè)半成品軟件平臺(tái),軟件框架和應(yīng)用軟件:八股文/元芳體與具體文章汽車流水線與汽車第26頁,共154頁,星期六,2024年,5月基于框架的軟件開發(fā)引入軟件框架之后,整個(gè)開發(fā)過程變成了“分三步走”:決定應(yīng)用架構(gòu)選擇實(shí)現(xiàn)應(yīng)用架構(gòu)的框架基于框架之下編寫程序(簡單、統(tǒng)一)優(yōu)點(diǎn):代碼具有相同規(guī)范和結(jié)構(gòu),易于理解和維護(hù);提高效率;更穩(wěn)定更可靠。局限:囿于框架所限定的“框框”之內(nèi)構(gòu)建應(yīng)用程序,比較死板,缺乏靈活性第27頁,共154頁,星期六,2024年,5月典型框架產(chǎn)品支持MVC架構(gòu)模式的框架:Java開源MVC框架Struts微軟平臺(tái)的MVC4框架PHP的Zend框架多種框架產(chǎn)品的組合使用:如SSH(Struts、Spring、Hibernate)第28頁,共154頁,星期六,2024年,5月Struts2簡介MVC:View:由JSP頁面實(shí)現(xiàn)Model:由自行編寫的Action對象完成,Action類就是一個(gè)普通的Java類,里面封裝了領(lǐng)域?qū)ο蟮膶傩院头椒ǎ梢杂糜诖嫒?shù)據(jù)和執(zhí)行有關(guān)業(yè)務(wù)邏輯。屬性和方法也可以分開到不同類中。Controller:由Struts2的內(nèi)置過濾器(dispatcherfilter)、攔截器(interceptor)或自行編寫的攔截器來實(shí)現(xiàn),過濾器和攔截器可以截獲JSP頁面請求,解析http請求中的參數(shù),賦值給Action對象中對應(yīng)的屬性,還可以在調(diào)用Action之前或之后進(jìn)行預(yù)處理或后處理。第29頁,共154頁,星期六,2024年,5月11.2高層結(jié)構(gòu)設(shè)計(jì)高層結(jié)構(gòu)討論系統(tǒng)比較大的組成部件(如包、構(gòu)件、子系統(tǒng)等)及其接口設(shè)計(jì)。11.2.1包11.2.2子系統(tǒng)及接口11.2.3構(gòu)件及接口第30頁,共154頁,星期六,2024年,5月11.2.1包包(Package)是一種邏輯分組手段,可以取UML模型中的任何一種事物,將相關(guān)成分聚在一起,以構(gòu)成更高層的組織單元——包。最常用的方法是將類以包為單位進(jìn)行分組,比如上一節(jié)提到的層,每一層中的所有類組成一個(gè)包。一個(gè)包可以包含其它的包,高層包被分成若干子包,子包又可以在分成更小的包。但在Java中,包還指代了物理的組織手段第31頁,共154頁,星期六,2024年,5月如何分包分包(軟件類的分組)有兩種原則:共同封閉原則(CommonClosurePrinciple)。一個(gè)包中的各個(gè)類應(yīng)該是由于相似的原則而改變,即將一組職責(zé)相似、但以不同方式實(shí)現(xiàn)的類歸為一個(gè)包中。比如按照層來進(jìn)行分包就是這種類型。共同復(fù)用原則(CommonReusePrinciple)。一個(gè)包中的各個(gè)類應(yīng)該一起被復(fù)用,復(fù)用其中一個(gè)可能需要同時(shí)考慮同一個(gè)包中的其它協(xié)作類。通常和業(yè)務(wù)功能相關(guān)。第32頁,共154頁,星期六,2024年,5月包圖包圖用來描述包及其依賴關(guān)系。當(dāng)表現(xiàn)層包中的類要使用領(lǐng)域包中的領(lǐng)域類提供的服務(wù)時(shí),表示包就依賴于領(lǐng)域包。第33頁,共154頁,星期六,2024年,5月11.2.2子系統(tǒng)及接口當(dāng)按照相對完整和獨(dú)立的業(yè)務(wù)功能或管理職能組織包,并對這樣的包進(jìn)行封裝后,一個(gè)高層的具有特定功能的可以運(yùn)行的獨(dú)立構(gòu)件就產(chǎn)生了,稱為子系統(tǒng)(Subsystem)。子系統(tǒng)對外可以提供有限的接口,只要接口不改變,不管子系統(tǒng)內(nèi)部發(fā)生什么變化,也不會(huì)影響到依賴于該子系統(tǒng)接口的其它子系統(tǒng)。子系統(tǒng)及其關(guān)系使用UML構(gòu)件圖(componentdiagram)描述。第34頁,共154頁,星期六,2024年,5月理解接口概念詞典釋義兩個(gè)不同系統(tǒng)(或子程序)交接并通過它彼此作用的部分。人類與計(jì)算機(jī)之間的接口稱為用戶接口。計(jì)算機(jī)硬件元件間的接口叫硬件接口。計(jì)算機(jī)軟件元件間的接口叫軟件接口。內(nèi)部接口:系統(tǒng)內(nèi)部各元件間的接口外部接口:系統(tǒng)對外提供給其他系統(tǒng)使用的接口API:應(yīng)用編程接口(ApplicationProgrammingInterface),一種應(yīng)用程序提供的外部接口的說法第35頁,共154頁,星期六,2024年,5月區(qū)分子系統(tǒng)和包子系統(tǒng)與包在語義上具有差異:子系統(tǒng)是一種通過一個(gè)或多個(gè)它所實(shí)現(xiàn)的接口來提供行為的軟件單位,可運(yùn)行,具有物理意義。包并不提供行為,包只不過是用來容納各種其他模型元素的容器,一般是邏輯意義上的。第36頁,共154頁,星期六,2024年,5月子系統(tǒng)的關(guān)系財(cái)務(wù)子系統(tǒng)將內(nèi)部操作進(jìn)行了封裝,但對外提供必要的接口(比如一組函數(shù))銷售子系統(tǒng)在執(zhí)行銷售業(yè)務(wù)過程中可以使用該接口對銷售數(shù)據(jù)執(zhí)行某些財(cái)務(wù)操作。對于銷售子系統(tǒng)而言,依賴的是財(cái)務(wù)子系統(tǒng)的接口,并不需要關(guān)心財(cái)務(wù)子系統(tǒng)的具體實(shí)現(xiàn)。采用UML2.0的構(gòu)件圖表示如下:第37頁,共154頁,星期六,2024年,5月子系統(tǒng)的關(guān)系子系統(tǒng)之間的關(guān)系:數(shù)據(jù)接口:定義相互可以理解的數(shù)據(jù)格式和數(shù)據(jù)文件,子系統(tǒng)之間采用數(shù)據(jù)文件進(jìn)行通信。服務(wù)接口:定義相互可以理解的軟件服務(wù)(操作、消息),子系統(tǒng)之間采用發(fā)送服務(wù)請求和響應(yīng)來進(jìn)行通信。思考:教務(wù)管理系統(tǒng)(基礎(chǔ)數(shù)據(jù)子系統(tǒng)、排課子系統(tǒng)、成績管理子系統(tǒng)、畢設(shè)管理子系統(tǒng)),各子系統(tǒng)是否有關(guān)系?第38頁,共154頁,星期六,2024年,5月不同系統(tǒng)的關(guān)系子系統(tǒng)及接口關(guān)系也可以擴(kuò)展到不同系統(tǒng)及接口關(guān)系,如學(xué)籍管理系統(tǒng)與其他系統(tǒng)的關(guān)系需要服務(wù):高招系統(tǒng)(獲取學(xué)生信息)、教委學(xué)位系統(tǒng)(學(xué)位數(shù)據(jù)上報(bào))本系統(tǒng)需要提供的服務(wù):提供學(xué)生學(xué)籍信息同樣可采用UML構(gòu)件圖描述:學(xué)籍管理系統(tǒng)高招系統(tǒng)教委系統(tǒng)發(fā)布錄取學(xué)生學(xué)位授予上報(bào)檔案系統(tǒng)提供學(xué)籍信息第39頁,共154頁,星期六,2024年,5月11.2.2構(gòu)件及接口構(gòu)件(component)是系統(tǒng)中實(shí)際存在的可更換部分,它實(shí)現(xiàn)特定的功能,符合一套接口標(biāo)準(zhǔn)并實(shí)現(xiàn)一組接口。構(gòu)件是可復(fù)用的軟件組成成份,可被用來構(gòu)造其他軟件。在系統(tǒng)中采用構(gòu)件軟件程序不需要重新編譯,也不需要構(gòu)件自身的源代碼并且不局限于某一種編程語言,所以構(gòu)件的復(fù)用也稱為二進(jìn)制復(fù)用(binaryreuse),因?yàn)樗墙⒃诮涌诙皇窃创a級別的復(fù)用。構(gòu)件及其關(guān)系使用UML構(gòu)件圖描述。第40頁,共154頁,星期六,2024年,5月構(gòu)件圖1構(gòu)件之間存在依賴關(guān)系:DataAccess構(gòu)件用于實(shí)現(xiàn)數(shù)據(jù)存取訪問,對外提供接口名為SearchInDB(查詢數(shù)據(jù)庫,接口參數(shù)等細(xì)節(jié)省略)。Book構(gòu)件實(shí)現(xiàn)圖書的管理,對外提供SearchBook(查詢圖書)和ExportToXml(導(dǎo)出圖書為XML文件)兩個(gè)接口。Book構(gòu)件需要使用DataAccess構(gòu)件提供的接口,即構(gòu)件Book依賴于DataAccess構(gòu)件。

DataAccessBookSearchBookExportToXmlSearchInDB第41頁,共154頁,星期六,2024年,5月區(qū)分子系統(tǒng)和構(gòu)件子系統(tǒng)和構(gòu)件在結(jié)構(gòu)上具有差異:子系統(tǒng)是一個(gè)系統(tǒng),是有特定功能的整體,可以直接使用,不會(huì)被復(fù)用。構(gòu)件只是構(gòu)成系統(tǒng)的元素,不具備單獨(dú)使用的能力,用于復(fù)用。第42頁,共154頁,星期六,2024年,5月11.3面向?qū)ο笤O(shè)計(jì)方法10.4.1根據(jù)架構(gòu)設(shè)計(jì)軟件類10.4.2設(shè)計(jì)類的屬性10.4.3設(shè)計(jì)類的方法10.4.4設(shè)計(jì)類的關(guān)系第43頁,共154頁,星期六,2024年,5月11.3.1根據(jù)架構(gòu)設(shè)計(jì)軟件類一種3層的分層模式:從分析模型的領(lǐng)域類導(dǎo)出設(shè)計(jì)階段中的實(shí)體類增加邊界類和控制類完成程序的交互和控制。為了分辨出類的這三種不同類型,可以采用UML提供的擴(kuò)展機(jī)制——構(gòu)造型(stetreotype)及其表達(dá)符號來定義模型元素構(gòu)造型第44頁,共154頁,星期六,2024年,5月Rose中不同構(gòu)造型的圖符<<邊界類>><<實(shí)體類>><<控制類>>系統(tǒng)邊界對象行為的控制和協(xié)調(diào)系統(tǒng)服務(wù)和信息第45頁,共154頁,星期六,2024年,5月分層的軟件類協(xié)作實(shí)現(xiàn)一個(gè)用例第46頁,共154頁,星期六,2024年,5月1、邊界類邊界類的職責(zé)是完成系統(tǒng)與其參與者之間的交互。接收來自用戶和外部系統(tǒng)的信息與請求將信息與請求提交給用戶和外部系統(tǒng)通過用例圖可以得知每個(gè)邊界類至少應(yīng)該與一個(gè)參與者有關(guān),參與者類型不同,邊界類的設(shè)計(jì)也不同邊界類包括屏幕窗口、通信接口、打印機(jī)接口、傳感器、終端以及專用API(應(yīng)用程序編程接口)等軟件對象。對于圖書館系統(tǒng)來說,參與者都是系統(tǒng)用戶,因此邊界類只有窗口界面這一種形式。假如考慮提供館際互借業(yè)務(wù),那么系統(tǒng)就會(huì)產(chǎn)生與其它外部合作的圖書館系統(tǒng)的交互,這時(shí)與外部系統(tǒng)間的通信接口也是一種邊界類第47頁,共154頁,星期六,2024年,5月識(shí)別邊界類:圖書管理員?boundary?:借書用戶界面圖書管理員借出圖書根據(jù)用例圖,每個(gè)參與者與一個(gè)用例交互,必定導(dǎo)出一個(gè)邊界類第48頁,共154頁,星期六,2024年,5月圖書館系統(tǒng)的用例圖第49頁,共154頁,星期六,2024年,5月2、實(shí)體類實(shí)體類來源于領(lǐng)域模型中的類。實(shí)體類是一個(gè)軟件對象,表示了領(lǐng)域?qū)ο蟮男畔?,以及具有與它所表示的信息有關(guān)的操作。實(shí)體類反映的信息需要在系統(tǒng)中進(jìn)行處理,并需要進(jìn)行持久化存儲(chǔ)。持久化存儲(chǔ)可以由實(shí)體類來實(shí)現(xiàn),也可以設(shè)計(jì)專門的數(shù)據(jù)訪問類來完成。第50頁,共154頁,星期六,2024年,5月邊界類和實(shí)體類的交互邊界類僅負(fù)責(zé)數(shù)據(jù)的輸入和輸出,不應(yīng)承擔(dān)和數(shù)據(jù)處理有關(guān)的業(yè)務(wù)邏輯,可負(fù)責(zé)部分不太復(fù)雜的數(shù)據(jù)校驗(yàn)功能(如非空檢查、多個(gè)輸入域之間的約束和聯(lián)動(dòng))。邊界類通過與實(shí)體類的交互,獲得有關(guān)數(shù)據(jù)處理的結(jié)果:圖書管理員驗(yàn)證?boundary?:借書用戶界面?entity?:讀者第51頁,共154頁,星期六,2024年,5月3、控制類控制類代表協(xié)調(diào)、排序、事務(wù)處理以及對其它對象的控制,經(jīng)常用于封裝與某個(gè)具體用例有關(guān)的控制流。控制類處理和協(xié)調(diào)用例事件流中的主要?jiǎng)幼骱涂刂屏?,并將部分任?wù)委派給其它對象。根據(jù)分層原則,控制類不封裝與參與者交互有關(guān)的內(nèi)容,也不封裝與系統(tǒng)處理的長效持久的信息有關(guān)的問題,這些問題分別由邊界類和實(shí)體類進(jìn)行封裝。第52頁,共154頁,星期六,2024年,5月識(shí)別控制類當(dāng)用例邏輯較為復(fù)雜,并涉及到多個(gè)實(shí)體類時(shí),可以考慮采用控制類簡化方案:控制類的職責(zé)合并給邊界類獲取驗(yàn)證:圖書管理員創(chuàng)建?boundary?:借書用戶界面?control?:借書控制類?entity?:讀者?entity?:資源項(xiàng)目?entity?:借書記錄第53頁,共154頁,星期六,2024年,5月不同類的職責(zé)分配向下依賴的關(guān)系:邊界類負(fù)責(zé)與參與者的交互(輸入數(shù)據(jù)、顯示數(shù)據(jù))為GUI的每個(gè)彈出式屏幕創(chuàng)建一個(gè)邊界對象??刂祁悾蛇x)負(fù)責(zé)一個(gè)用例的事件流,或部分復(fù)雜數(shù)據(jù)流實(shí)體類負(fù)責(zé)數(shù)據(jù)的封裝為每個(gè)領(lǐng)域類創(chuàng)建一個(gè)實(shí)體類第54頁,共154頁,星期六,2024年,5月圖書館系統(tǒng)的界面類第55頁,共154頁,星期六,2024年,5月圖書館系統(tǒng)的控制類第56頁,共154頁,星期六,2024年,5月圖書館系統(tǒng)的實(shí)體類第57頁,共154頁,星期六,2024年,5月其他架構(gòu)方案上述三層架構(gòu):表現(xiàn)層/控制層/實(shí)體層MVC框架:每個(gè)功能對應(yīng)一個(gè)頁面類,即View(邊界類)每個(gè)頁面的請求都由Control類負(fù)責(zé)處理(控制類)Control類使用Model類存取數(shù)據(jù)(實(shí)體類)架構(gòu)不同,要設(shè)計(jì)的軟件類也不同第58頁,共154頁,星期六,2024年,5月11.3.2設(shè)計(jì)類的屬性屬性類型和初值屬性的類型和默認(rèn)的初始值應(yīng)該在設(shè)計(jì)模型中表示出來。類型和屬性名之間用冒號隔開,等號之后寫初值。選擇的數(shù)據(jù)類型最好是目標(biāo)語言中可用的。關(guān)聯(lián)屬性屬性的可見性類中的每個(gè)屬性可以有可見性定義,指定該屬性可以被其它類利用的程度,UML定義了4種屬性可見性:公有(public)“+”受保護(hù)(protected)“#”私有(private)“-”包(package)“~”第59頁,共154頁,星期六,2024年,5月圖書館類圖第60頁,共154頁,星期六,2024年,5月11.3.3建立用戶界面原型用戶界面原型是一個(gè)草圖,包含用例提到的系統(tǒng)和用戶進(jìn)行交互的必要元素界面原型不描述太多細(xì)節(jié),通常包含以下內(nèi)容:需要由用戶輸入到系統(tǒng)中的數(shù)據(jù)窗口或表格;需要由系統(tǒng)執(zhí)行的操作按鈕;系統(tǒng)應(yīng)及時(shí)做出回應(yīng)的事件;需要由系統(tǒng)輸出給用戶的數(shù)據(jù)窗口或消息。第61頁,共154頁,星期六,2024年,5月借書界面設(shè)計(jì)第62頁,共154頁,星期六,2024年,5月借書界面設(shè)計(jì)界面數(shù)據(jù)說明第63頁,共154頁,星期六,2024年,5月借書界面設(shè)計(jì)界面事件及響應(yīng)說明第64頁,共154頁,星期六,2024年,5月圖書館系統(tǒng)的還書界面第65頁,共154頁,星期六,2024年,5月11.3.4設(shè)計(jì)類的方法交互圖中的消息映射為接受消息的對象類的方法(操作)消息表達(dá)式中的參數(shù)和返回值等映射為類方法函數(shù)的參數(shù)和返回值同義詞釋疑:操作是關(guān)于行為的定義,方法是行為的實(shí)現(xiàn),服務(wù)是行為的對外表現(xiàn),消息是行為如何協(xié)作,它們用于不同的角度、場合、時(shí)機(jī)和模型中,但可以將它們認(rèn)為是同義詞第66頁,共154頁,星期六,2024年,5月1.職責(zé)類的方法是對象應(yīng)該執(zhí)行的操作,也稱為對象的職責(zé)和義務(wù)。職責(zé)是在設(shè)計(jì)過程中分配給每個(gè)類的,可以采取的方法有:使用交互圖使用CRC技術(shù)第67頁,共154頁,星期六,2024年,5月職責(zé)完成的兩種情況一項(xiàng)職責(zé)的完成有以下兩種情況:1.由某個(gè)對象獨(dú)立承擔(dān),比如“計(jì)算超期天數(shù)”由一個(gè)Loan對象負(fù)責(zé)。2.主要由一個(gè)對象負(fù)責(zé),但該對象將職責(zé)進(jìn)行了二次分配或分解。比如“負(fù)責(zé)計(jì)算訂單總額”應(yīng)該由一個(gè)Order對象負(fù)責(zé),Order類為了完成該職責(zé),需求OrderItem對象的協(xié)作,OrderItem對象負(fù)責(zé)提供每個(gè)訂單項(xiàng)的小計(jì)金額(數(shù)量*單價(jià))。軟件對象的職責(zé)分配可以映射到現(xiàn)實(shí)世界中的分工和協(xié)作,例如:部門經(jīng)理A布置業(yè)務(wù)人員B完成一項(xiàng)任務(wù)x,B可能一個(gè)人獨(dú)立承擔(dān)該任務(wù),B也可能將任務(wù)分解為x1、x2、x3,自己負(fù)責(zé)x1和x2,請C負(fù)責(zé)x3。第68頁,共154頁,星期六,2024年,5月職責(zé)的兩種類型職責(zé)有兩種類型:1.行為型:即對象本身的方法。比如進(jìn)行一項(xiàng)計(jì)算、被創(chuàng)建時(shí)的初始化、執(zhí)行控制或協(xié)調(diào)的各項(xiàng)活動(dòng)。2.了解型:對象應(yīng)掌握的信息。比如對象自身的數(shù)據(jù)和屬性、相關(guān)聯(lián)的對象以及能夠派生或計(jì)算的對象(set/get方法),如Loan類需要了解借出和歸還日期(屬性),以及所借資源的有關(guān)情況,即ResourceItem或ResourceTitle對象(關(guān)聯(lián)對象)。第69頁,共154頁,星期六,2024年,5月CRC卡片法CRC卡片法是一種職責(zé)分配技術(shù),CRC是類-職責(zé)-協(xié)作(Class-Responsibility-Collaboration)的簡稱。具體實(shí)踐過程:首先為系統(tǒng)中每個(gè)軟件類制作一張卡片選取一個(gè)用例,確定該用例的參與類取出上述確定的類卡片通過移動(dòng)卡片來討論類如何協(xié)作完成用例功能最后將形成的職責(zé)概念記錄在類所在的卡片上。雖然它不是UML的組成部分,但也是一種快捷有效的的OO設(shè)計(jì)技術(shù)。直接建模(繪制順序圖)同理。第70頁,共154頁,星期六,2024年,5月2.對象交互建模交互模型的設(shè)計(jì)內(nèi)容:對象職責(zé)的識(shí)別,意味著對象協(xié)作過程中消息的分發(fā)定義消息的完整格式將消息映射為類的操作,并在實(shí)現(xiàn)時(shí)轉(zhuǎn)化為類的方法第71頁,共154頁,星期六,2024年,5月3.消息的設(shè)計(jì)消息規(guī)范化設(shè)計(jì),需要使用以下表達(dá)式語法:return:=message(parameter:parameterType):returnType如果類型信息非常明顯或不重要的話,可以省略書寫,如:reader:=getReader(cardID:String)消息的序號消息的次序用自小到大的順序號來表示。按照消息的完成情況,消息可以有嵌套消息(代表任務(wù)分解)。嵌套消息的序號按照層次編號,所有嵌套的子消息都是服務(wù)于其上層消息。第72頁,共154頁,星期六,2024年,5月嵌套消息嵌套消息含義與結(jié)構(gòu)化方法中的模塊調(diào)用相同結(jié)構(gòu)化方法中模塊都是單個(gè)的,沒有分組。面向?qū)ο蠓椒ㄒ矎?qiáng)調(diào)模塊的概念,但模塊都有一個(gè)主人——對象OOD中的模塊劃分要解決兩個(gè)問題:任務(wù)如何分解為子任務(wù)?各個(gè)任務(wù)應(yīng)由誰承擔(dān)?第73頁,共154頁,星期六,2024年,5月嵌套消息示例計(jì)算超期罰金,最高不超過書價(jià)Loan對象在計(jì)算超期罰金時(shí)還需要獲取資源的價(jià)格和罰金標(biāo)準(zhǔn),因此向ResourceItem發(fā)送請求價(jià)格的消息,向FineRule發(fā)送超期罰金標(biāo)準(zhǔn),而ResourceItem對象并不記錄價(jià)格,因此請求價(jià)格的消息還需要發(fā)送給ResourceTitle對象。第74頁,共154頁,星期六,2024年,5月嵌套消息示例代碼Loan::getTotalFine():double{ titlePrice=itemObject.getTitlePrice(); finePerDay=fineObject.getOverDueFine();

doublefineAmount=finePerDay*(this.returnDate–this.dueDate); if(fineAmount<titlePrice) returnfineAmount; else returntitlePrice;}ResourceItem::getTitlePrice():double{ returnitsTitleObject.getPrice();}第75頁,共154頁,星期六,2024年,5月返回消息很多消息發(fā)送之后,消息的接收對象會(huì)在響應(yīng)后產(chǎn)生一些結(jié)果回傳給發(fā)送者,這就是返回消息。在UML交互圖中,返回消息以虛線箭頭線表示。為了簡潔,一般省略返回消息。第76頁,共154頁,星期六,2024年,5月自身消息有些消息是對象發(fā)給自己的。比如借書界面中要增加一個(gè)借閱項(xiàng)目,首先發(fā)送消息給控制類請求業(yè)務(wù)邏輯的處理(makeNewLoan消息),然后在窗口的列表中將新的借閱記錄添加進(jìn)來(addListItem)以備瀏覽和打印,添加列表的功能是界面類的職責(zé),消息應(yīng)發(fā)給窗口對象自身通常是一個(gè)類內(nèi)部的private方法第77頁,共154頁,星期六,2024年,5月兩類特殊的消息對象創(chuàng)建UML中使用create消息表示對象實(shí)例化和初始化。例如,在C#和Java中,使用new操作符接構(gòu)造函數(shù)的調(diào)用方式來實(shí)現(xiàn)實(shí)例的自動(dòng)分配和初始化。常在設(shè)計(jì)類圖中忽略相關(guān)的方法。屬性存取在某些語言中,所有屬性都聲明為私有的,因此需要發(fā)送消息實(shí)現(xiàn)屬性的存取。例如getPrice和setPrice。為了模型的簡潔,有時(shí)也省略這些消息,但在類圖中可以通過屬性的可見性來明確它們是否存在。第78頁,共154頁,星期六,2024年,5月圖書館系統(tǒng)的借書界面第79頁,共154頁,星期六,2024年,5月圖書館順序圖1借書(分析階段,消息使用中文)第80頁,共154頁,星期六,2024年,5月設(shè)計(jì)階段——圖書館順序圖示例loop借書(消息對應(yīng)為類的方法)第81頁,共154頁,星期六,2024年,5月圖書館系統(tǒng)的還書界面第82頁,共154頁,星期六,2024年,5月圖書館順序圖2還書(備選事件流使用opt框架,表示可選分支):loop第83頁,共154頁,星期六,2024年,5月圖書館順序圖2還書(主事件流,簡單的備選事件流可以畫在一張圖上,復(fù)雜的備選事件流可以另畫一張順序圖)loop第84頁,共154頁,星期六,2024年,5月4.為類添加方法對象職責(zé)體現(xiàn)為順序圖中類所收到的消息,也就是類的方法。類的方法可以定義可見性,當(dāng)然順序圖中的絕大多數(shù)消息是公有方法。第85頁,共154頁,星期六,2024年,5月實(shí)體類的方法類圖(包含屬性和方法):第86頁,共154頁,星期六,2024年,5月11.3.5設(shè)計(jì)類的關(guān)系設(shè)計(jì)四種關(guān)系的具體實(shí)現(xiàn):泛化(類)關(guān)聯(lián)(對象)實(shí)現(xiàn)(類)依賴(對象)第87頁,共154頁,星期六,2024年,5月1.泛化設(shè)計(jì)泛化在面向?qū)ο笳Z言中使用繼承來實(shí)現(xiàn),繼承機(jī)制實(shí)現(xiàn)了子類擁有父類特性的這一過程。泛化設(shè)計(jì)還有一個(gè)更重要的目的在于如何實(shí)現(xiàn)多態(tài)性。第88頁,共154頁,星期六,2024年,5月2.關(guān)聯(lián)設(shè)計(jì)實(shí)現(xiàn)對象關(guān)聯(lián)的一個(gè)簡單策略就是:在關(guān)聯(lián)的源類中聲明一個(gè)屬性來保存對目標(biāo)類的實(shí)例的引用,這種屬性稱為關(guān)聯(lián)屬性或引用屬性。根據(jù)關(guān)聯(lián)的導(dǎo)航性,有單向關(guān)聯(lián)和雙向關(guān)聯(lián)。根據(jù)關(guān)聯(lián)重?cái)?shù),有一對一、一對多和多對多關(guān)聯(lián),多對多關(guān)聯(lián)通過建立關(guān)聯(lián)類分解成1對多的關(guān)聯(lián)。限定關(guān)聯(lián)。第89頁,共154頁,星期六,2024年,5月單向關(guān)聯(lián)//實(shí)現(xiàn)代碼對照:publicclassResourceTitle{ privateReservationr1; privateMapitems=newHaspMap();

…}第90頁,共154頁,星期六,2024年,5月重?cái)?shù)為0..1的關(guān)聯(lián)對于可選關(guān)聯(lián),源對象雖然定義了目標(biāo)對象,但目標(biāo)對象可能為空值(通常為null值),意味著沒有關(guān)聯(lián)對象。如某種書當(dāng)前不存在預(yù)定記錄。關(guān)聯(lián)屬性的值可以在源對象的構(gòu)造函數(shù)中被創(chuàng)建,也可能在運(yùn)行過程中通過方法賦值。publicclassResourceTitle{ privateReservationtheReserve; //關(guān)聯(lián)屬性

publicReservationgetReservation(){//獲取關(guān)聯(lián)對象

returntheReserve; } publicvoidsetReservation(Reservationrs){ theReserve=rs; }}第91頁,共154頁,星期六,2024年,5月重?cái)?shù)為多的關(guān)聯(lián)對于重?cái)?shù)為多的關(guān)聯(lián),源對象應(yīng)該能夠管理多個(gè)目標(biāo)對象。實(shí)現(xiàn)這種關(guān)聯(lián)最簡單的方法是使用開發(fā)語言提供的類庫中的容器類來保存多個(gè)對象引用,如Map、List類等。示例代碼如下:publicclassResourceTitle{ privateMapitems=newHaspMap(); //集合關(guān)聯(lián)屬性

publicvoidaddItem(StringitemID){ //對象也可作參數(shù)

ResourceItemaCopy=newResourceItem(itemID); items.put(itemID,aCopy); } publicvoidremoveItem(StringitemID){ items.remove(itemID); }}第92頁,共154頁,星期六,2024年,5月雙向關(guān)聯(lián)當(dāng)關(guān)聯(lián)雙方需要相互都能訪問到對方時(shí),就是雙向關(guān)聯(lián)。比如Loan能知道所借的是哪一個(gè)ResourceItem,并且ResourceItem能夠訪問到對應(yīng)的Loan。具體實(shí)現(xiàn)有多種辦法,以下代碼是一種示例。publicclassResourceItem{ privateLoantheLoan; //關(guān)聯(lián)屬性

publicvoidaddLoan(Loanloan){ //建立雙向關(guān)聯(lián)

theLoan=newLoan(this); }

……}publicclassLoan{ privateResourceItemtheItem; //關(guān)聯(lián)屬性

publicLoan(ResourceItemr){ //Loan的構(gòu)造函數(shù)

theItem=r; //建立和ResourceItem的關(guān)聯(lián)

}

……}第93頁,共154頁,星期六,2024年,5月關(guān)聯(lián)的創(chuàng)建或解除關(guān)聯(lián)可以在對象一產(chǎn)生就已經(jīng)存在,也可以在運(yùn)行期間動(dòng)態(tài)建立。對于那些比較持久并且不會(huì)發(fā)生變化的關(guān)聯(lián),或者具有很強(qiáng)歸屬關(guān)系的聚集關(guān)聯(lián),一般在主對象的構(gòu)造函數(shù)中創(chuàng)建關(guān)聯(lián)對象或記錄下關(guān)聯(lián)對象的引用較為松散的對象關(guān)聯(lián),一般當(dāng)某項(xiàng)業(yè)務(wù)邏輯發(fā)生時(shí),兩個(gè)對象的關(guān)聯(lián)才被確立,可以設(shè)計(jì)特定方法建立或解除關(guān)聯(lián)。第94頁,共154頁,星期六,2024年,5月動(dòng)態(tài)創(chuàng)建關(guān)聯(lián)舉例publicClassCar

privateDrivertheDriver;

…… publicvoidassignDriver(Driverdr){theDriver=dr }}Carc1=newCar(“京B58888”,“紅旗”);Driverd1=NewDriver("Wang");Driverd2

=NewDriver("Zhao");c1.assignDriver(d1); //建立c1和d1之間的關(guān)聯(lián)……c1.assignDriver(d2); //建立c1和d2之間的關(guān)聯(lián),c1和d1的關(guān)聯(lián)被解除第95頁,共154頁,星期六,2024年,5月3.接口與實(shí)現(xiàn)的設(shè)計(jì)所有的實(shí)體類都具有這些數(shù)據(jù)庫操作行為,將這些操作抽象出來封裝到一個(gè)IEntityOperate接口中public

interface

IEntityOperate{

int

InsertEntity(); //插入對象數(shù)據(jù)到數(shù)據(jù)庫中int

UpdateEntity(); //更新對象數(shù)據(jù)到數(shù)據(jù)庫中

int

DeleteEntity(); //刪除數(shù)據(jù)庫中指定對象數(shù)據(jù)}第96頁,共154頁,星期六,2024年,5月4.依賴設(shè)計(jì)在類圖中依賴關(guān)系通常指明一個(gè)類的對象實(shí)例使用了另一個(gè)類的屬性和方法。界面層使用了控制層對象,控制層對象使用了數(shù)據(jù)訪問層對象。第97頁,共154頁,星期六,2024年,5月類的耦合類之間的聯(lián)系的緊密程度就是類之間的耦合度。四種關(guān)系的耦合程度從高至低:泛化實(shí)現(xiàn)關(guān)聯(lián)依賴(上層對象依賴于下層對象)第98頁,共154頁,星期六,2024年,5月類的內(nèi)聚類的合理封裝內(nèi)部屬性和方法的關(guān)系緊密單一職責(zé)的類不要雜湊類不要大而全的類第99頁,共154頁,星期六,2024年,5月11.4對象持久化與數(shù)據(jù)庫軟件中的對象在程序中定義的對象,在系統(tǒng)運(yùn)行期間其生命周期包含創(chuàng)建、使用和消亡三個(gè)階段。因?yàn)槌绦蛩写a和數(shù)據(jù)在運(yùn)行時(shí)載入到內(nèi)存,程序運(yùn)行結(jié)束它們都要從內(nèi)存中釋放,所以這些對象實(shí)例都是瞬時(shí)的或暫時(shí)性的。信息系統(tǒng)中的對象一個(gè)信息系統(tǒng)中的領(lǐng)域類指代了系統(tǒng)中有意義的事物,這些領(lǐng)域?qū)ο蠹捌渌休d的信息是長期的,甚至是永久的。這些持久對象就是指生存期可以超越軟件的一次執(zhí)行時(shí)間而長期存在的對象。軟件對象如何持久化?第100頁,共154頁,星期六,2024年,5月持久化對象持久對象就是指生存期可以超越程序的任意一次執(zhí)行時(shí)間而長期存在的對象。比如新建了一名讀者對象,程序結(jié)束后該讀者的基本信息將轉(zhuǎn)化為持久保存的讀者數(shù)據(jù),這個(gè)過程也是通常所說的“物化”。反過來,持久后的數(shù)據(jù)需要取出并重新生成對象,這個(gè)過程稱為“反物化”。通常實(shí)體對象都會(huì)成為持久對象,實(shí)體類也稱為持久類。第101頁,共154頁,星期六,2024年,5月11.4.1幾種持久化方案文件從文件查詢有關(guān)數(shù)據(jù)來初始化對象或創(chuàng)建一個(gè)新對象。對象發(fā)生改變或需要保存,則將對象數(shù)據(jù)寫入到文件中(如XML文件)。但復(fù)雜靈活的數(shù)據(jù)存取和查詢難以實(shí)現(xiàn)。面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)(OODBMS)一種理想的基于存儲(chǔ)和管理永久對象的對象管理系統(tǒng),只要程序員聲明某個(gè)對象是永久的,OODBMS中數(shù)據(jù)庫模型和對象模型一致。對象的存儲(chǔ)、恢復(fù)、轉(zhuǎn)換等問題由OODBMS自動(dòng)解決。但目前尚未達(dá)到廣泛應(yīng)用的階段。成熟的關(guān)系型數(shù)據(jù)庫系統(tǒng)(RDBMS)關(guān)系型數(shù)據(jù)庫以二維表中的一條記錄來保存某個(gè)對象,記錄的字段對應(yīng)對象屬性,繼承關(guān)系或關(guān)聯(lián)關(guān)系通過表之間的聯(lián)系表現(xiàn)。對象與關(guān)系兩個(gè)概念之間存在“阻抗”,因此需要進(jìn)行映射。該方案是目前最普及的選擇。其他的存儲(chǔ)機(jī)制還有層次數(shù)據(jù)庫、網(wǎng)狀數(shù)據(jù)庫等等第102頁,共154頁,星期六,2024年,5月持久化設(shè)計(jì)的步驟確定持久類及其持久屬性確定持久化方案設(shè)計(jì)XML文件模式(Schema)或設(shè)計(jì)關(guān)系數(shù)據(jù)庫的模型根據(jù)持久化方案設(shè)計(jì)持久化方法或持久化組件第103頁,共154頁,星期六,2024年,5月關(guān)系型數(shù)據(jù)庫的持久化方案在確定持久類及其持久屬性之后,還要解決以下問題:實(shí)體類如何對應(yīng)到關(guān)系中的表呢?類的繼承關(guān)系和對象關(guān)聯(lián)如何體現(xiàn)?關(guān)系數(shù)據(jù)庫的操作總結(jié)起來就是CRUD操作:創(chuàng)建記錄(Create)、查詢記錄(Retrieve)、修改記錄(Update)和刪除記錄(Delete),這些操作應(yīng)該由誰來實(shí)現(xiàn)?什么時(shí)候使用?對象實(shí)例是內(nèi)存的一個(gè)單元,使用實(shí)例名來標(biāo)識(shí),表中的記錄則采用唯一的主鍵碼來識(shí)別,如何實(shí)現(xiàn)特定對象實(shí)例和記錄的一一對應(yīng)呢?第104頁,共154頁,星期六,2024年,5月11.4.2ORM設(shè)計(jì)問題無論自己編寫代碼實(shí)現(xiàn)持久化,還是使用持久化組件,都要解決一個(gè)問題,那就是:對象與數(shù)據(jù)庫的映射關(guān)系。采用關(guān)系型數(shù)據(jù)庫實(shí)現(xiàn)對象的數(shù)據(jù)存儲(chǔ),這種映射也稱為對象-關(guān)系映射ORM(ObjectRelationalMapping)。ORM的設(shè)計(jì)包括:確定對象和表的映射關(guān)系確定軟件實(shí)現(xiàn)構(gòu)架第105頁,共154頁,星期六,2024年,5月1、對象-關(guān)系的映射類映射到表關(guān)聯(lián)關(guān)系的映射繼承關(guān)系的映射第106頁,共154頁,星期六,2024年,5月持久類映射到表在一個(gè)第三范式的關(guān)系數(shù)據(jù)庫中,表中每一行(每個(gè)“元組”)都被認(rèn)為是一個(gè)對象。表中的列則對應(yīng)于持久類的持久屬性(注意:持久類也可能有臨時(shí)屬性)。在沒有其他關(guān)聯(lián)類的簡單情況下,這兩種模型間的映射將會(huì)很簡單。類的屬性對應(yīng)于列,其數(shù)據(jù)類型轉(zhuǎn)換為列允許的數(shù)據(jù)類型之一。

第107頁,共154頁,星期六,2024年,5月關(guān)聯(lián)關(guān)系的映射兩個(gè)持久對象間的關(guān)聯(lián)關(guān)系在OOAD中通常表現(xiàn)為一個(gè)對象存放了另一個(gè)對象的對象引用(也稱為關(guān)聯(lián)屬性),而在表中則表現(xiàn)為外鍵。外鍵是一個(gè)表中的一列,其中存放所關(guān)聯(lián)對象的主鍵值。對于對象關(guān)聯(lián)中的特殊類型——組成聚集,因?yàn)檎w對象和部分對象具有相同的生存周期,因此為了在數(shù)據(jù)模型中實(shí)現(xiàn)引用完整性,數(shù)據(jù)庫詳細(xì)設(shè)計(jì)時(shí)還需要實(shí)施刪除約束,比如刪除圖書館某個(gè)資源品種就必須同時(shí)刪除所有的資源項(xiàng)。以及參照完整性的設(shè)計(jì)第108頁,共154頁,星期六,2024年,5月ReaderLoan借閱1*讀者:

讀者編號,讀者姓名,讀者單位,當(dāng)前限額借書記錄:

ID,讀者編號,館藏流水號,借書日期,到期日期,歸還日期館藏項(xiàng):館藏流水號,當(dāng)前狀態(tài)ResourceItem0..11記載第109頁,共154頁,星期六,2024年,5月繼承關(guān)系的映射

三種可選方式:繼承關(guān)系樹的每個(gè)類對應(yīng)一個(gè)表:使用不同的表來分別表示父類和子類。繼承關(guān)系樹的每個(gè)具體類對應(yīng)一個(gè)表:將所有父類的屬性復(fù)制為子類表中不同的列,父類不建立對應(yīng)的表。繼承關(guān)系樹只對應(yīng)一個(gè)表:使用一張表來描述父類和所有子類的屬性,額外還需要增加一個(gè)列表示對象所屬的子類型。第110頁,共154頁,星期六,2024年,5月BookDiscResourceTitle1、三個(gè)表:品種:ISBN,名稱,作者,出版日期,價(jià)格…書籍:ISBN,開本光盤:ISBN,光盤類型,盤片數(shù)量2、兩個(gè)表:書籍:ISBN,名稱,作者…,開本光盤:ISBN,名稱,作者…,光盤類型,盤片數(shù)量3、一個(gè)表品種:ISBN,名稱,作者…,品種類別,開本,光盤類型,盤片數(shù)量第111頁,共154頁,星期六,2024年,5月2、持久化軟件架構(gòu)設(shè)計(jì)(1)在領(lǐng)域?qū)訉?shí)現(xiàn),即直接在實(shí)體類中編寫SQL語句訪問數(shù)據(jù)庫,或者為了減少數(shù)據(jù)庫操作的代碼數(shù)量,編寫一個(gè)公用的數(shù)據(jù)訪問類,各實(shí)體類將組裝好的SQL語句傳遞給該類以實(shí)現(xiàn)數(shù)據(jù)庫訪問。(2)設(shè)計(jì)簡單的數(shù)據(jù)映射層實(shí)現(xiàn)數(shù)據(jù)訪問,即把SQL訪問從業(yè)務(wù)邏輯中分離出來,放到獨(dú)立的類中。當(dāng)每個(gè)實(shí)體類映射為一張表時(shí),可以為每個(gè)實(shí)體類建立一個(gè)數(shù)據(jù)訪問類,一般包括數(shù)據(jù)查找方法以及更新、插入和刪除方法。(3)設(shè)計(jì)功能獨(dú)立具有數(shù)據(jù)映射器的持久層。業(yè)務(wù)邏輯層完全不用了解數(shù)據(jù)的存儲(chǔ),應(yīng)用程序中的對象通過設(shè)置與表的映射關(guān)系后,可以在開發(fā)人員對底層數(shù)據(jù)庫及其模型毫不知情的情況下實(shí)現(xiàn)數(shù)據(jù)的持久化。映射關(guān)系通過數(shù)據(jù)映射器來具體實(shí)施,它是分離內(nèi)存對象和數(shù)據(jù)庫的一個(gè)軟件層,其職責(zé)是在內(nèi)存對象和數(shù)據(jù)庫之間傳遞數(shù)據(jù)并保持它們彼此獨(dú)立。第112頁,共154頁,星期六,2024年,5月三種設(shè)計(jì)方法的舉例參見用戶權(quán)限的VB程序,實(shí)體類負(fù)責(zé)數(shù)據(jù)庫的訪問參見微軟PetShop程序,數(shù)據(jù)庫訪問通過編寫數(shù)據(jù)訪問層的類來實(shí)現(xiàn)。比如業(yè)務(wù)層的類Order,有Insert、getOrder方法分別完成保存和查詢的功能,這些方法中使用了數(shù)據(jù)訪問層的類來讀寫數(shù)據(jù)庫網(wǎng)上可查閱Hibernate示例程序,代碼中不需要編寫SQL語句第113頁,共154頁,星期六,2024年,5月11.5設(shè)計(jì)原則總的原則抽象與復(fù)用(封裝、信息隱藏)松耦合面向功能模塊設(shè)計(jì)功能內(nèi)聚的模塊,避免使用全局?jǐn)?shù)據(jù)模塊傳遞的參數(shù)作數(shù)據(jù)用,并且盡可能少模塊內(nèi)語句數(shù)一般為50-100面向?qū)ο髥我宦氊?zé)、開放封閉、里氏替換、依賴倒置…面向服務(wù)標(biāo)準(zhǔn)化服務(wù)合約、服務(wù)松散耦合、服務(wù)抽象、服務(wù)可復(fù)用、服務(wù)自治、服務(wù)無狀態(tài)、服務(wù)可發(fā)現(xiàn)性和服務(wù)可組合性第114頁,共154頁,星期六,2024年,5月11.5.1抽象與復(fù)用模塊化:模塊是廣泛意義上的建模元素,可以是子過程或函數(shù)、類、構(gòu)件、服務(wù)、流程等。模塊化強(qiáng)調(diào)抽象和封裝。好的抽象能讓人們集中精力考慮問題實(shí)質(zhì),而忽略問題中與主旨無關(guān)的次要部分。好的封裝能讓一個(gè)部件暴露出其最本質(zhì)的內(nèi)容,讓人們快速理解和使用它,不讓復(fù)雜性蔓延。模塊化的另一個(gè)好處就是復(fù)用。不同業(yè)務(wù)流程中重復(fù)對一組數(shù)據(jù)執(zhí)行同一操作,對這類數(shù)據(jù)和操作進(jìn)行合理抽象和封裝后,就能在多個(gè)地方進(jìn)行復(fù)用,節(jié)約了成本,提高了效率。第115頁,共154頁,星期六,2024年,5月11.5.2松耦合任何事物只要相互之間存在某種關(guān)系,就意味著事物間的耦合。緊耦合:是指應(yīng)用系統(tǒng)的各部件在功能上、數(shù)據(jù)上或結(jié)構(gòu)上是緊密相連的,因而每當(dāng)某個(gè)部件發(fā)生變化時(shí),相關(guān)部分的也要隨之進(jìn)行部分甚至整個(gè)應(yīng)用程序的調(diào)整。松耦合:面對變化則具有很好的適應(yīng)能力和應(yīng)變能力。耦合和內(nèi)聚有著密切關(guān)系,通常高內(nèi)聚就會(huì)帶來松耦合。第116頁,共154頁,星期六,2024年,5月11.5.3單一職責(zé)原則SRP即內(nèi)聚性原則。單一職責(zé)的模塊—>單一職責(zé)的類。一個(gè)類承擔(dān)的職責(zé)過多,某個(gè)職責(zé)的變化可能會(huì)削弱或者抑制該類完成其他職責(zé)的能力,并影響到構(gòu)建、測試和部署等活動(dòng)。多職責(zé)會(huì)導(dǎo)致脆弱的和不易理解的設(shè)計(jì)。職責(zé)過多的職工類第117頁,共154頁,星期六,2024年,5月分離職責(zé)到不同的類對“雜湊類”進(jìn)行分解第118頁,共154頁,星期六,2024年,5月11.5.4開放封閉原則OCP軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該是“可擴(kuò)展”的,但又是“不可修改”的?!白兓攀遣蛔兊恼胬怼保ㄟ^設(shè)計(jì)使得系統(tǒng)能夠適應(yīng)改變又能保持相對穩(wěn)定,避免僵化的設(shè)計(jì)。開放-封閉原則實(shí)現(xiàn)兩個(gè)目標(biāo):“對于擴(kuò)展是開放的”(openforextension)。這意味著模塊的行為是可擴(kuò)展的,從而使其具有滿足那些改變的新需求。“對于更改是封閉的”(closedformodification)。當(dāng)對模塊進(jìn)行擴(kuò)展時(shí),不必改動(dòng)模塊的源代碼或二進(jìn)制代碼(如dll/jar文件)。自相矛盾嗎?第119頁,共154頁,星期六,2024年,5月什么是不封閉、不開放如下的模型可以處理月薪制(SALARIED)和時(shí)薪制(WAGED)職工工資,時(shí)薪制根據(jù)考勤卡計(jì)算。如果增加了一種新的職工類型,其計(jì)酬方式不同(如提成制),則必定要修改Employee類(即Employee是不封閉的),如果讓其封閉,開放擴(kuò)展又是不可能的。第120頁,共154頁,星期六,2024年,5月如何改進(jìn)利用抽象機(jī)制封閉:Employee及其已有的子類是封閉的,不可改開放:可以派生新的子類,實(shí)現(xiàn)新的需求,可擴(kuò)展第121頁,共154頁,星期六,2024年,5月11.5.5Liscov替換原則LSP實(shí)現(xiàn)OCP的主要機(jī)制是抽象和多態(tài)。怎樣設(shè)計(jì)最佳的繼承層次,BarbaraLiskov在1988年首次提出LSP:子類型(subtype)必須能夠替換掉它們的基類型(basetype)。假設(shè)S是T的子類型,所有使用了T對象的程序(也稱客戶程序),用S對象替換T對象后,仍能成功執(zhí)行。LSP是多態(tài)順利實(shí)現(xiàn)的保證,從而使OCP成為可能。因?yàn)檎亲宇愋偷目商鎿Q性才使得使用基類的模塊在無需修改的情況下就可以擴(kuò)展。增加或修改任何一個(gè)子類型,基類不用修改(封閉)基類的使用者(客戶程序)通過多態(tài)得到擴(kuò)展或修改過的行為(開放)。第122頁,共154頁,星期六,2024年,5月一個(gè)使用繼承的例子正方形是長方形的一種特例第123頁,共154頁,星期六,2024年,5月會(huì)發(fā)生什么情況?正方形有獨(dú)特的行為方式通過覆蓋父類的有關(guān)方法來實(shí)現(xiàn)子類行為第124頁,共154頁,星期六,2024年,5月客戶程序如何能了解長方形的使用者按照長方形的特點(diǎn)來調(diào)用SetWidth和SetHeight兩個(gè)函數(shù),并測試面積,代碼如下:voidtestArea(Rectangle&r){ r.SetWidth(5); r.SetHeight(4); assert(r.Area()==20);}如果傳遞進(jìn)來的是Square對象又會(huì)如何呢?顯然會(huì)出現(xiàn)斷言錯(cuò)誤,測試失敗。對于客戶程序來說,模型中的層次結(jié)構(gòu)是脆弱的,因?yàn)檫`反了LSP替換原則,Square對象和Rectangle對象的行為方式不相容,這樣的抽象即使采用虛函數(shù)也無法實(shí)現(xiàn)子類對父類的替換。違反LSP替換原則,多態(tài)的使用是不安全的。第125頁,共154頁,星期六,2024年,5月11.5.6依賴倒置原則DIP高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴于抽象(也稱針對抽象編程);抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。結(jié)構(gòu)化設(shè)計(jì)時(shí),高層模塊總是依賴于低層模塊。面向?qū)ο蟮姆謱幽J街幸彩歉邔拥念愐蕾囉诘讓拥念?。按照自上而下的依賴關(guān)系,高層的策略設(shè)置模塊往往是無法重用的,如果設(shè)法讓高層模塊獨(dú)立于低層模塊,則實(shí)現(xiàn)重用就變?yōu)榭赡?。依賴倒置原則的啟發(fā)式建議是“依賴于抽象”,具體做法是將高層需要的服務(wù)聲明為抽象接口,高層使用這些接口,低層模塊實(shí)現(xiàn)這些接口,使得高層不再依賴于低層,而是依賴于抽象接口,同樣低層也依賴于抽象接口。第126頁,共154頁,星期六,2024年,5月傳統(tǒng)的依賴層次高層使用低層的對象及其服務(wù)第127頁,共154頁,星期六,2024年,5月都依賴于抽象設(shè)計(jì)抽象接口,上層類使用接口,下層類實(shí)現(xiàn)接口這樣Button類也可以得到重用,也許是開關(guān)燈,也許是開關(guān)電視,根據(jù)創(chuàng)建具體對象完成多態(tài)的行為。第128頁,共154頁,星期六,2024年,5月如何遵守設(shè)計(jì)原則設(shè)計(jì)原則不是死記硬背,而是要靈活運(yùn)用一些成熟的設(shè)計(jì)模式可以幫助我們解決實(shí)際問題,并且符合設(shè)計(jì)原則第129頁,共154頁,星期六,2024年,5月11.6軟件設(shè)計(jì)模式GRASP對象職責(zé)分配模式GRASP(GeneralResponsibilityAssignmentSoftwarePattern)是一組通用的基本原則和慣用的設(shè)計(jì)方案,用來指導(dǎo)對象職責(zé)的分配和交互圖的創(chuàng)建。OOAD經(jīng)典著作《UML和模式應(yīng)用》進(jìn)行了總結(jié)和應(yīng)用。GoF23種設(shè)計(jì)模式由四人組的專著《設(shè)計(jì)模式》一書總結(jié)了廣為應(yīng)用的23種設(shè)計(jì)模式,每種模式解決了一個(gè)特定問題,包括一組合適的對象和對象接口,以及對象間協(xié)作的方式。第130頁,共154頁,星期六,2024年,5月模式無處不在好萊塢電影模式社會(huì)題材、動(dòng)作片、言情片、歷史題材片…中國象棋開局當(dāng)頭炮、順炮、列炮、屏風(fēng)馬…圍棋布局星小目、三連星、中國流、宇宙流…古代行軍布陣八陣圖、天門陣、一字長蛇陣…建筑、服裝、交通、社會(huì)、文化…諸多模式模式是對成功應(yīng)用經(jīng)驗(yàn)的總結(jié)與復(fù)用第131頁,共154頁,星期六,2024年,5月設(shè)計(jì)模式的基本思想-1軟件是在不斷進(jìn)化的需求在不斷改變,所以軟件應(yīng)該適應(yīng)變化設(shè)計(jì)模式是為了讓軟件更加適應(yīng)變化,有更多的可復(fù)用性;就是有變化時(shí)你不用從頭重寫一次這個(gè)軟件如何適應(yīng)變化?就應(yīng)該封裝變化,讓變化的影響最小封裝復(fù)雜性,提供簡單的接口第132頁,共154頁,星期六,2024年,5月設(shè)計(jì)模式的基本思想-2遵守上述設(shè)計(jì)原則:松耦合針對接口編程,而不是針對實(shí)現(xiàn)編程使用繼承、組合、委托、多態(tài)、泛型第133頁,共154頁,星期六,2024年,5月11.6.1什么是設(shè)計(jì)模式美國建筑設(shè)計(jì)大師ChristopherAlexander,在他出版的一本關(guān)于城市規(guī)劃和建筑設(shè)計(jì)的著作《建筑的永恒方法》中,是這樣描述模式的:模式是一條由三部分組成的規(guī)則,它表示了一個(gè)特定環(huán)境、一個(gè)問題和一個(gè)解決方案之間的關(guān)系。每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題以及該問題解決方案的核心內(nèi)容。這樣,你就能一次又一次地使用該方案而不必做重復(fù)勞動(dòng)。Eachpatterndescribesaproblemwhichoccursoverandoveragaininourenvironments,andthendescribesthecoreofthesolutiontothatproblem,insuchawaythatyoucanusethissolutionamilliontimesover,withouteverdoingitthesamewaytwice. --ChristopherAlexander,

APatternLanguage,1977第134頁,共154頁,星期六,2024年,5月設(shè)計(jì)模式名成為專業(yè)詞匯討論設(shè)計(jì)方案時(shí),使用模式名能簡化描述第135頁,共154頁,星期六,2024年,5月設(shè)計(jì)模式是:優(yōu)秀的設(shè)計(jì)范例從優(yōu)秀設(shè)計(jì)方案中發(fā)現(xiàn)和總結(jié)出來的經(jīng)驗(yàn)在實(shí)踐中反復(fù)出現(xiàn)的設(shè)計(jì)問題的優(yōu)秀解決方案設(shè)計(jì)者相互交流的基本術(shù)語:設(shè)計(jì)語言培養(yǎng)優(yōu)秀設(shè)計(jì)師的一條捷徑不是:面向?qū)ο笤O(shè)計(jì)的框架可供簡單組合的設(shè)計(jì)元件發(fā)明創(chuàng)造出來的創(chuàng)新思路解決面向?qū)ο笤O(shè)計(jì)問題的完整方案第136頁,共154頁,星期六,2024年,5月設(shè)計(jì)模式的基本要素名稱:用于助記,形象表示這個(gè)模式問題:這個(gè)模式可以解決什么問題解決方案:這個(gè)模式怎樣解決這個(gè)問題的步驟與方法效果:使用這個(gè)模式與不使用這個(gè)模式有什么區(qū)別,它有什么優(yōu)點(diǎn)和缺點(diǎn)一個(gè)問題可以有多種解法,好的解法都可以找到很多種,每種都有優(yōu)缺點(diǎn),某個(gè)模式也不一定永遠(yuǎn)是最好的第137頁,共154頁,星期六,2024年,5月11.6.2GoF設(shè)計(jì)模式GangofFour,簡稱GoF,他們是:ErichGammaRichardHelmRalphJohnsonJohnVlissides(2005年底去世)著作《設(shè)計(jì)模式》第138頁,共154頁,星期六,2024年,5月23種GoF模式創(chuàng)建型結(jié)構(gòu)型行為型類FactoryMethodAdapter_ClassInterpreterTemplateMethod對象AbstractFactoryBuilderPrototypeSingletonAdapter_ObjectBridgeCompositeDecoratorFacadeFlyweightProxyChainofResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor第139頁,共154頁,星期六,2024年,5月GoF模式分類-1根據(jù)模式的目的(用來完成什么工作的)創(chuàng)建型模式結(jié)構(gòu)型模式行為型模式根據(jù)模式的作用范圍(是處理類還是處理對象的):類

溫馨提示

  • 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

提交評論