版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
對(duì)象設(shè)計(jì)的主要任務(wù):精化類的屬性和操作明確類之間的關(guān)系整理和優(yōu)化設(shè)計(jì)模型4.4對(duì)象設(shè)計(jì)第4章面向?qū)ο蟮脑O(shè)計(jì)1松惰剝碗比菲迪糠紊務(wù)峻鱗背瓜獎(jiǎng)綠熄鄭擁姨撈溉吐躥初倆門(mén)扁仔晚胃埋面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-對(duì)象設(shè)計(jì)的主要任務(wù):4.4對(duì)象設(shè)計(jì)第4章面向1
4.4.1對(duì)類的屬性的處理4.4.4應(yīng)用設(shè)計(jì)模式定義操作4.4.2關(guān)聯(lián)的設(shè)計(jì)4.4.3對(duì)結(jié)構(gòu)的優(yōu)化4.4.5檢查系統(tǒng)設(shè)計(jì)2內(nèi)容勻嚙顱特搔塔舶忍卷畦臨腕站棵搜族顆特白比蹬弊柜剛糟枉籬戰(zhàn)僳織瘟垣面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-4.4.1對(duì)類的屬性的處理4.4.4應(yīng)用設(shè)計(jì)模式定24.4.1對(duì)類的屬性的處理(1)回顧屬性的來(lái)源(2)成員細(xì)節(jié)的表示3(3)在哪里展示非簡(jiǎn)單數(shù)據(jù)類型和純數(shù)據(jù)值?
(4)對(duì)屬性的數(shù)量和單位建模(5)對(duì)屬性的處理(6)外部鍵的屬性咒顴琶疽平劉息輿馳郎湍酌憊甭忙稅奧攏亭蹭捧瘧窄札騷童癬粗偷被健斃面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-4.4.1對(duì)類的屬性的處理(1)回顧屬性的來(lái)源(2)3(1)回顧屬性的來(lái)源類所代表的現(xiàn)實(shí)實(shí)體的基本信息;描述狀態(tài)的信息;派生屬性(derivedattribute)如:類CourseOffering中的“學(xué)生數(shù)目”/numStudents:int描述該類與其他類之間關(guān)聯(lián)的信息;其他常見(jiàn)的類型:
地址Address、顏色Color、幾何元素Geometrics、電話號(hào)碼PhoneNumber、通用商品代碼UPC、社會(huì)安全代碼SocialSecurityNumber、郵政編碼PostalCode、枚舉類型等。4收時(shí)囑毗京普炮雙瞞壞當(dāng)桓閘尾城嚼釋銜臘裕鵬申該軌限臘敘滔磺國(guó)德愈面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(1)回顧屬性的來(lái)源類所代表的現(xiàn)實(shí)實(shí)體的基本信息;描述狀態(tài)4具體說(shuō)明屬性的名稱、類型、缺省值、可見(jiàn)性等;Public:‘+’;Private:‘-’;Protected:‘#’。(2)成員細(xì)節(jié)的表示基本原則盡可能將所有屬性的可見(jiàn)性設(shè)置為private;僅通過(guò)set方法更新屬性;僅通過(guò)get方法訪問(wèn)屬性。圖4-56有細(xì)節(jié)的類圖5燃由硼豫漆羽翼劉莖倘接箭輥家半坑遙妻雇嶺多鉗倒眺葦占價(jià)定囑份排辮面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(2)成員細(xì)節(jié)的表示基本原則圖4-56有細(xì)節(jié)的類圖5燃由5(3)在哪里展示非簡(jiǎn)單數(shù)據(jù)類型和純數(shù)據(jù)值?
ProductSpecificationupc:UPCStoreAddress:AddressProductSpecificationUPC*1StoreAddress*1UPC是非簡(jiǎn)單數(shù)據(jù)類型(要對(duì)它進(jìn)行驗(yàn)證,也可包括制造者屬性),即有屬性和關(guān)聯(lián),也可用概念來(lái)表示。UPC是純數(shù)據(jù)值,在概念模型中當(dāng)作屬性看待。
圖4-57用概念表示屬性UPC是一個(gè)純數(shù)據(jù)值,但也可以是一個(gè)非簡(jiǎn)單數(shù)據(jù)類型。6逸岡舞推踢三萎弛攬獎(jiǎng)汲騙縣棘悶以銥霧虹梅竿勘賜稠宏甭盒亨敞偉論躍面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(3)在哪里展示非簡(jiǎn)單數(shù)據(jù)類型和純數(shù)據(jù)值?Product6(4)對(duì)屬性的數(shù)量和單位建模Paymentamount:NumberPaymentQuantityamount:Number*1Paymentamount:Quantity數(shù)量是純數(shù)據(jù)值,可作為屬性這個(gè)表示可用,但不靈活或不可靠,要知道支付貨款時(shí)所用的貨幣單位。
UnitHas-amountIs-in*1將數(shù)量作為一個(gè)單獨(dú)概念圖4-58對(duì)屬性的數(shù)量和單位建模7熄瓷炕巨要諸心熬南毅狙幻博捅準(zhǔn)鎢屁駿巨窿濫陌剖毅彩庶緯只湘凈撇擻面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(4)對(duì)屬性的數(shù)量和單位建模PaymentPaymentQ7(5)對(duì)屬性的處理保留派生屬性,避免重復(fù)計(jì)算描述其他事物的規(guī)格說(shuō)明Flight航班datanumbertimeAirport機(jī)場(chǎng)nameFlies-to*1Flight航班datatimeDescribed-by*1Airport機(jī)場(chǎng)nameFlightDescriptionnumber*1Describes-flights-to較好圖4-59描述其他事物的規(guī)格說(shuō)明較差
8悸鉆閨鼠撒恨寨引放誤藥茍椅死渾硅娠議呼數(shù)忙似疽淀背擄砂源磋驟淳瓊面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(5)對(duì)屬性的處理保留派生屬性,避免重復(fù)計(jì)算描述其他事8分析階段的數(shù)據(jù)類型只能是簡(jiǎn)單的、原始的數(shù)據(jù)類型,并不表示如C++、Java、Smalltalk中的屬性(數(shù)據(jù)成員、實(shí)例變量)
(分析中的類圖是對(duì)問(wèn)題的存在建立的分析模型,而不是軟件實(shí)體的分析模型)。在軟件構(gòu)造和設(shè)計(jì)階段,對(duì)象之間的關(guān)聯(lián)通常是用指向其他復(fù)雜類型的屬性來(lái)表示(但不是唯一的解決方案)。(6)外部鍵的屬性9涌感擁芒轍蜀風(fēng)隕贅冰轎染祁況慚猾濕鞠寧杉拎備除喪趨服矽榔條支兄秩面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-分析階段的數(shù)據(jù)類型只能是簡(jiǎn)單的、原始的數(shù)據(jù)類型,并不表示如C9在分析階段的對(duì)象模型中,不是使用屬性,而是使用關(guān)聯(lián)來(lái)聯(lián)系兩個(gè)概念的。設(shè)計(jì)中的類圖,使用外鍵實(shí)現(xiàn)對(duì)象間的聯(lián)系。CashiernamePOSTnumberUses11圖4-60不使用外部鍵的屬性CashierNamecureentPOSTNumber使用外部鍵的屬性與另一個(gè)對(duì)象發(fā)生聯(lián)系
圖4-61有外部鍵的屬性10(6)外部鍵的屬性菊藩?dú)ぴ婢d旅鋼仿輯薊句他羨敝麥騰佑嫌什暗竣駱綻似彝詭穿柑郎燃榨面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-在分析階段的對(duì)象模型中,不是使用屬性,而是使用關(guān)聯(lián)來(lái)聯(lián)系兩104.4.2關(guān)聯(lián)(Association)的設(shè)計(jì)(1)四種連接(2)增加冗余關(guān)聯(lián),提供訪問(wèn)效率(3)對(duì)限定關(guān)聯(lián)(qualifiedassociation)的考慮(4)增加關(guān)聯(lián)的導(dǎo)航(navigability)(5)對(duì)關(guān)聯(lián)類的設(shè)計(jì)11市藹嘩碳涕快鯉永津嘩僵次蟄市增爺買(mǎi)宛模檸擄埋惟蝦虞欄畢輪懇掇戀快面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-4.4.2關(guān)聯(lián)(Association)的設(shè)計(jì)(1)11(1)四種連接全局(global):某個(gè)對(duì)象可以在全局范圍內(nèi)直接被其他對(duì)象“引用”。
參數(shù)(Parameter):某個(gè)對(duì)象作為另一個(gè)對(duì)象的某個(gè)操作參數(shù)或者返回值。
局部(Local):某個(gè)對(duì)象在另一個(gè)對(duì)象的某個(gè)操作中充當(dāng)臨時(shí)變量。域(Field):某個(gè)對(duì)象作為另一個(gè)對(duì)象的數(shù)據(jù)成員(聚合/組合關(guān)系)。兩個(gè)類間依賴關(guān)系12味應(yīng)脅探昂斯畔敝晰朗氨捻渭羹扎硬縱秉虜漬摘滌短蛛距煩賬重臺(tái)灰奏咖面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(1)四種連接全局(global):某個(gè)對(duì)象可以在全局范圍12對(duì)象的連接方式attach(Timer
observerobs)detach(Timer
observerobs)notify()Timertick()TimerobserverinplayPosition():Cpointtick()SpriteFlayfieldCpoint0..1Velocity
tick()move()MovablespriteStationarysprite觀察者圖4-62對(duì)象的連接方式13苑皆矗芯嚼缺曬田夷群泌諜堪慢因鷗陷忠胃惡血遭醫(yī)宅欣膝全技綽跌騎攣面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-對(duì)象的連接方式attach(TimerTimertick(13關(guān)聯(lián)源對(duì)象關(guān)聯(lián)指針屬性關(guān)聯(lián)對(duì)象指針next屬性關(guān)聯(lián)對(duì)象指針next被關(guān)聯(lián)對(duì)象被關(guān)聯(lián)對(duì)象節(jié)點(diǎn)用指針或引用方式實(shí)現(xiàn)關(guān)聯(lián):0..*圖4-63單向關(guān)聯(lián)的實(shí)現(xiàn)公司雇員雇員雇主公司雇員14盲懇椽巋藉賭蠱安匹弟結(jié)交吻捌圍傣仔蓑沁稍酚攘順嘛糊泥且旗酞吳除飯面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-關(guān)聯(lián)源對(duì)象關(guān)聯(lián)指針屬性關(guān)聯(lián)對(duì)象指針next屬性關(guān)聯(lián)對(duì)象指針14用java實(shí)現(xiàn)關(guān)聯(lián):
保險(xiǎn)公司保險(xiǎn)合同10..*有涉及PublicclassInsurance-Company{/*方法*/PrivateInsurance-ContractVectorContracts}PublicclassInsurance-Contract{/*方法*/PrivateInsurance-Companyrefer-to;}鏈屬性的實(shí)現(xiàn)——依賴于關(guān)聯(lián)的階數(shù)15忻傀汲弛歌僚躺穿沽兌餐蛇睫狼撤件扇有贈(zèng)雄翰佯樹(shù)青功檀束攬?zhí)浍F相獰面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-用java實(shí)現(xiàn)關(guān)聯(lián):保險(xiǎn)公司保險(xiǎn)合同10..*有涉及Pub15(2)增加冗余關(guān)聯(lián),提供訪問(wèn)效率**公司Find-skill雇員技能圖4-64增加類16公司雇員娛剮圣捐芯一佑吏累紛捆揍段險(xiǎn)窯烈才剎榔嗽栽曳繡撓鎳塌澡楊舷獎(jiǎng)紅予面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(2)增加冗余關(guān)聯(lián),提供訪問(wèn)效率**公司雇員技能圖4-616(3)對(duì)限定關(guān)聯(lián)(qualifiedassociation)的考慮主要是減少限定符遠(yuǎn)端處的多重性,從多個(gè)減少到1個(gè)。分析類圖中的限定符只是區(qū)分兩種不同類型的事物?;貞?7在設(shè)計(jì)類圖中,關(guān)聯(lián)的限定符是用某種鍵值或者記號(hào)實(shí)現(xiàn)的,而不是用Java的引用實(shí)現(xiàn)的。課候摟匙豬憫餅式角篩梧褂淌號(hào)鈾確臺(tái)掂琺技期弓芝其痢紛箔諱瑰擔(dān)秀搜面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(3)對(duì)限定關(guān)聯(lián)(qualifiedassociatio17圖4-65關(guān)聯(lián)的限定符Employee
LoginServeletempidpublicclassLoginServelet{privateStringempid;publicStringgetName(){Employeee=DB.getEmp(empid);returne.getName();}}18(3)對(duì)限定關(guān)聯(lián)(qualifiedassociation)的考慮劑哄做逐柴稽礙雄涪從伸衙傳黑化練帖殉懂酞妙增札恨早慘伯右孽若搪砌面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-圖4-65關(guān)聯(lián)的限定符EmployeeLoginemp18在設(shè)計(jì)類圖中,導(dǎo)航是角色的一個(gè)特性,它說(shuō)明從源對(duì)象到目標(biāo)對(duì)象沿著關(guān)聯(lián)有一個(gè)單向的鏈接。(4)增加關(guān)聯(lián)的導(dǎo)航(navigability)導(dǎo)航箭頭的關(guān)聯(lián)表示從源類到目標(biāo)類的屬性可見(jiàn)性。在實(shí)現(xiàn)時(shí),導(dǎo)航箭頭用源類中所定義的一個(gè)屬性來(lái)實(shí)現(xiàn),這個(gè)屬性引用了目標(biāo)類的一個(gè)實(shí)例。19率渭刨芳耪后伸著蟲(chóng)釘農(nóng)姐罷銑化炎筍慷都遞憂濕室索談扦耐撩搐糊旋芭面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-在設(shè)計(jì)類圖中,導(dǎo)航是角色的一個(gè)特性,它說(shuō)明從源對(duì)象到目標(biāo)對(duì)象19POSTSaledateisComplete:BooleantimeCaptures捕獲11becomeComplete()makeLineItem()makePayment()total()endSale()enterItem()makePayment()圖4-66對(duì)象模型和設(shè)計(jì)類圖導(dǎo)航箭頭說(shuō)明對(duì)象被單向鏈接到Sale對(duì)象POST類可能有一個(gè)指向Sale對(duì)象的屬性沒(méi)有導(dǎo)航箭頭說(shuō)明從Sale到POST方向沒(méi)有鏈接20題戈籬龜紉冬婪參因攏慶泊潰喘礙絮闌葵錦您半例季燭祖代凝緒叁九詩(shī)撾面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-POSTSaledateCaptures捕獲11201圖4-67添加引用屬性根據(jù)類圖中的關(guān)聯(lián)和導(dǎo)航關(guān)系可推導(dǎo)出一個(gè)類的引用屬性ProductSpecificationdescription:Textprice:Quantityupc:UPCSalesLineitemquantity:Integersubtotal():Quantity*Described-bypublicclassSalesLineitem{publicSalesLineitem(ProductSpecificationspec,intqty);publicfloatsubtotal();privateintquantity;簡(jiǎn)單屬性privateProductSpecificationprodSpec;引用屬性}prodSpec用屬性名作為角色名21謬?yán)桥甏枇亲屄豪碓L啤列彬栓邪索勃蒼徽漁幢搪蹲愚淤汞閥恢育照掏著慚面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-1圖4-67添加引用屬性根據(jù)類圖中的關(guān)聯(lián)和導(dǎo)航關(guān)系可推導(dǎo)出21分析中的關(guān)聯(lián),是增進(jìn)對(duì)問(wèn)題的理解為目的(不是對(duì)數(shù)據(jù)流、實(shí)例變量連接等所做的一條聲明)。說(shuō)明:設(shè)計(jì)類圖中的關(guān)聯(lián),是對(duì)軟件構(gòu)件的描述。設(shè)計(jì)類圖中關(guān)聯(lián)的選擇要依據(jù)交互圖中的可見(jiàn)性,和存儲(chǔ)特性。從A到B導(dǎo)航關(guān)聯(lián)的確定:
#A向B發(fā)送一個(gè)消息#A創(chuàng)建了B的一個(gè)實(shí)例#A需要維持到B之間的一個(gè)鏈接根據(jù)協(xié)作圖來(lái)確定導(dǎo)航。在程序語(yǔ)言中,實(shí)現(xiàn)關(guān)聯(lián)最普通的方法是使用一個(gè)指向關(guān)聯(lián)類的屬性。
22液辭頒酒嶼榨液范妒他憑煌秦芝刃淋崗截控捧唐抿查涵弟怔玲佑洲星謂夏面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-分析中的關(guān)聯(lián),是增進(jìn)對(duì)問(wèn)題的理解為目的(不是對(duì)數(shù)據(jù)流、實(shí)22在類圖中,依賴關(guān)系描繪類之間的非屬性的可見(jiàn)性時(shí)很有用,即描述參數(shù)、全局、局部可見(jiàn)性時(shí)很有用。普通的屬性可見(jiàn)性是用關(guān)聯(lián)線和導(dǎo)航箭頭來(lái)表示的。非屬性可見(jiàn)性的依賴關(guān)系23炯遜兆顏雨汞猩寬巾札俏酚挽孺葦?shù)侨赍帉脦徧雍$P儈恤唇默蜘翔面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-在類圖中,依賴關(guān)系描繪類之間的非屬性的可見(jiàn)性時(shí)很有用,即描述23
圖4-68非屬性可見(jiàn)性的依賴關(guān)系POSTendSale()enterItem()makePayment()SalesLineitemquantity:Integersubtotal()Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem()makePayment()Total()address:Addressname:TextaddSale()
StorePaymentamount:Quantity
ProductCatalogspecification()ProductSpecificationdescription:Textprice:Quantityupc:UPCHouses11Uses11Looks-in111..*1ContainsCaptures1111..*Contains1Describes*11Paid-by*1Loge-completed124娠陪折依讓反劣場(chǎng)敞描渤邦稼塑貓傾萍擺貳容靛劍蓉輪稈斌趣頌秀靠輾巖面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-圖4-68非屬性可見(jiàn)性的依賴關(guān)系POS24(5)對(duì)關(guān)聯(lián)類的設(shè)計(jì)Supplier供應(yīng)者Buyer買(mǎi)家Trade交易CompanyPersonjob***1..*關(guān)聯(lián)類的例子:25源類包含了一個(gè)對(duì)關(guān)聯(lián)類的引用,而關(guān)聯(lián)類又包含了對(duì)目標(biāo)類的引用。坦汰藥餌疽半咯營(yíng)補(bǔ)搗綁可綠嚼怒禍謗滬瓊磅僧驅(qū)鄭龐徹計(jì)忠罵壹勢(shì)晤戀面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(5)對(duì)關(guān)聯(lián)類的設(shè)計(jì)SupplierBuyerTradeC25上述設(shè)計(jì)有兩點(diǎn)不足:#
找出對(duì)應(yīng)一宗交易的都要花費(fèi)一定的力氣。#違反了對(duì)象封裝的原則,與交易相關(guān)的數(shù)據(jù)(供應(yīng)和買(mǎi)
家)沒(méi)放在交易對(duì)象中。Suppliercompany-name:Stringaddress:Stringbuyers:Buyer[*]trades:Trades[*]Buyername:Stringaddress:Stringsupplier:Supplier[*]trades:Trades[*]圖4-69供應(yīng)者與買(mǎi)家關(guān)聯(lián)類的設(shè)計(jì)關(guān)聯(lián)類在實(shí)際設(shè)計(jì)中十分有用,但現(xiàn)在的OO語(yǔ)言不直接支持關(guān)聯(lián)類,可以這樣設(shè)計(jì):26釜紊敘墓悍潤(rùn)磺率造夠絮障盟方蒂奠棠悟韓透違靛宰剖訊銘鉗攬逗章食崔面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-上述設(shè)計(jì)有兩點(diǎn)不足:#找出對(duì)應(yīng)一宗交易的都要花費(fèi)一定的力氣26Suppliercompany-name:Stringaddress:Stringtrades:Trades[*]Tradeproduct:Stringquantity:IntegerTotal-price:Doublesupplier:Supplierbuyer:Buyer
Buyername:Stringaddress:Stringtrades:Trades[*]1*1*圖4-70交易的一個(gè)通用方法把供應(yīng)者和買(mǎi)家對(duì)象直接放到交易中作為它的屬性。用二元關(guān)聯(lián)類的方法來(lái)解決27廟戚山炎淘田淵倫伺犁益又竊戲雞隙位狹緝俞疤嘎廢餐棲懼壬版軋暴餒恨面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-Buyer1*1*圖4-70交易的一個(gè)通用方法把供應(yīng)者和買(mǎi)27例如:飛機(jī)在每次飛行中,有兩個(gè)駕駛員(pilot-”人”類),航班(Flight),飛機(jī)(Airplane)和人(Person),有如下兩個(gè)設(shè)計(jì),評(píng)價(jià)設(shè)計(jì)。AirplanePersonFlight12pilot(a)PersonDuty2*(b)FlightAirplane*1pilot任務(wù)二元關(guān)聯(lián)類的每個(gè)實(shí)例,描述兩個(gè)類對(duì)象之間的link的性質(zhì)。本例中航班對(duì)象包含航班號(hào)、時(shí)間等數(shù)據(jù),對(duì)兩個(gè)駕駛員是一樣的,航班不應(yīng)是飛機(jī)和人員的關(guān)聯(lián)類。每個(gè)航班對(duì)象與一架飛機(jī)和兩個(gè)駕駛員有關(guān)系。在某一航班中,每個(gè)駕駛員有自己的任務(wù),作為關(guān)聯(lián)類來(lái)模擬。第2個(gè)設(shè)計(jì)允許一個(gè)駕駛員工作在不同航班,執(zhí)行不同任務(wù)(時(shí)間不沖突便可)。圖4-71比較兩個(gè)設(shè)計(jì)28躊鄂守縫猖拈未泅隅瞞床怪濁烴杜侵障色擂細(xì)編幼紹棄摔脈壇碰曝緣硬舍面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-例如:飛機(jī)在每次飛行中,有兩個(gè)駕駛員(pilot-”人”類28(1)調(diào)整繼承結(jié)構(gòu)4.4.3對(duì)結(jié)構(gòu)的優(yōu)化(2)解決死板的繼承(3)關(guān)于關(guān)系環(huán)的問(wèn)題29歷押翹梅侄沂晦樟隅輯蔗宴咒棚橢掘貝豐謝鏡拼窒緝?yōu)⑹诐{蟻彎川撿轍吶面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(1)調(diào)整繼承結(jié)構(gòu)4.4.3對(duì)結(jié)構(gòu)的優(yōu)化(2)解決死29(1)調(diào)整繼承結(jié)構(gòu)圖4-72繼承與委派機(jī)制ListNamelengthAddRemoveFirstlastStackPUSHPOPstack:List1PUSHPOP改為委派AddRemoveFirstlastList30《delegate》腹幅腰錘沉睡蓮沁佑拄海敦先撂戰(zhàn)抿珍遭億猶御緬廬涵低島塢翰池渡泡緘面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(1)調(diào)整繼承結(jié)構(gòu)圖4-72繼承與委派機(jī)制ListNam30委派機(jī)制我們經(jīng)常有這樣的一些需求,我們只想繼承一個(gè)類的部分功能,而另外一部分功能是我們不想要、甚至是對(duì)我們有害的功能,這時(shí)候,我們只能使用委派技術(shù),而不能使用繼承了?;谏厦娴囊恍┓治?,我們知道,繼承和委派技術(shù)都能擴(kuò)展一個(gè)類,使它擁有另外一個(gè)類的部分或者全部功能。但委派技術(shù)更為靈活,它可以使得一個(gè)類可以全部或部分的擴(kuò)展得到另一個(gè)類的功能,而繼承只能是全盤(pán)接收。classFoo{
deftest(){
println“haveatest”
}
deffoo(){
println“foo...”}
}classFoo2{
privatedelegate=newFoo()
deffoo()
{
this.delegate.foo()
}
deftestAgain()
{
println“testitagain”
}}31翼瑰膚蝦氏拙攀弟到紀(jì)洞喘洛然了愿攝逸雜展蓑群緒獸亂環(huán)斤蛇酞和謊械面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-委派機(jī)制我們經(jīng)常有這樣的一些需求,我們只想繼承一個(gè)類的部分功31(2)解決死板的繼承PersonUserBuyersupplier**交易圖4-73產(chǎn)生互不相容的子類圖4-74增加的角色類(手柄樣式)RoleUserBuyersupplier**交易Person1*用戶與供應(yīng)者的交易受到了限制一個(gè)人的對(duì)象可以有用戶和買(mǎi)家的角色32堯咯賂咆咯卿土硫躥動(dòng)阜籽綠卿中貨蘇山艘燎辯完裕卒仕尉妹鈍梆散薯潤(rùn)面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(2)解決死板的繼承PersonUserBuyersupp32(3)關(guān)于關(guān)系環(huán)的問(wèn)題ABFolderItemFolder正向容納反向容納圖4-75文件夾單項(xiàng)與文件夾關(guān)系環(huán)VersionRevision圖4-76原版與修訂版10..1previousnextFolderItemFolderFolderItemFolder圖4-77文件夾單項(xiàng)與文件夾關(guān)系環(huán)分解
分解使關(guān)系明確,證實(shí)設(shè)計(jì)的正確,行為特性更為明顯但未分解的類圖更為簡(jiǎn)潔,可直接與實(shí)施程序?qū)?yīng)33黑逐綿蕪水旦岳葫疤蟄塔審碾嚼吹沏嚎宛惟選紗濰刷夫誹喇窘競(jìng)專解繳盼面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(3)關(guān)于關(guān)系環(huán)的問(wèn)題ABFolderItemFolder33關(guān)系環(huán)能真實(shí)地反映實(shí)際應(yīng)用情況:如電腦系統(tǒng)的局部類Permission許可UserFileComputerSystem*1FolderItem文件夾項(xiàng)FileSystemFolder1..*11..**1*Owner0..*10..1**0..1*圖4-78電腦系統(tǒng)的局部類34迫兇僑而腮拔寡肺韌締猩鈞滯裔童食始藕焚婚晃那或碧擇瞅剪虱柴全莆吠面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-關(guān)系環(huán)能真實(shí)地反映實(shí)際應(yīng)用情況:如電腦系統(tǒng)的局部類Permi34圖4-79屬性、零件、部件組成的雙重關(guān)系環(huán)PartComponent1Attribute*1*containscontains屬性、零件、部件組成的雙重關(guān)系環(huán)35活續(xù)遵肌仿揪贈(zèng)霜療象搽雨惹咐莊疙譏低爆摸屁戍怕腑沸稅探牢柵賈帖埃面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-圖4-79屬性、零件、部件組成的雙重關(guān)系環(huán)PartComp35GroupItemSquare1..*containsCircle1圖4-80有葉結(jié)點(diǎn)類的關(guān)系環(huán)有葉結(jié)點(diǎn)類的關(guān)系環(huán)36蝸草吉嘿逆推乓驚媒肅胎攘氦覽膘度吩氫寥肥捐隔疼概腮嵌載咒魚(yú)抗鎖沏面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-GroupItemSquare1..*containsCir36反向關(guān)系環(huán);二元關(guān)聯(lián)類;網(wǎng)絡(luò)與結(jié)點(diǎn)是Link的對(duì)象管理器;誰(shuí)負(fù)責(zé)管理連接對(duì)象?例:如下是模塊(Module)、網(wǎng)絡(luò)(Nework)、結(jié)點(diǎn)(Node)、連接(Link)的兩個(gè)設(shè)計(jì),試進(jìn)行評(píng)價(jià)。
Module1*NeworkNodeLink1..***111Module*NeworkNodeLink1..*1*反向關(guān)系環(huán);遞歸關(guān)聯(lián);連接類與基類相連,復(fù)用源碼;結(jié)構(gòu)簡(jiǎn)化,避免重復(fù)和模糊的連接。圖4-81評(píng)價(jià)兩個(gè)反向關(guān)系環(huán)設(shè)計(jì)37朽北態(tài)敦惰賜么繕妙慘吸覽竣獲由偷凋錐阻幣話典衡錯(cuò)賦棚酮搭衡鑲丫隋面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-反向關(guān)系環(huán);例:如下是模塊(Module)、網(wǎng)絡(luò)(Newo374.4.4應(yīng)用設(shè)計(jì)模式(DesignPattern)定義操作(1)設(shè)計(jì)模式的概念(3)設(shè)計(jì)模式的分類38(4)設(shè)計(jì)模式的關(guān)系(5)介紹職責(zé)分配中通用原則的模式(2)模式的組成元素訟滌伸皖缺韻汽皿諺樣距啼影舞馬了鞘雹回沼慮耕俏床址舉苞散先晌昌眷面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-4.4.4應(yīng)用設(shè)計(jì)模式(DesignPattern)定38(1)設(shè)計(jì)模式的概念(designpattern)Alexander給出了經(jīng)典定義:“每個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出現(xiàn)的問(wèn)題,然后描述了該問(wèn)題的解決核心。通過(guò)這種方式,你可以無(wú)數(shù)次的使用那些已有的解決方案,無(wú)需在重復(fù)相同的工作?!蹦J矫枋鰹椋涸谝欢ōh(huán)境中解決某一問(wèn)題的方案,包括三個(gè)基本元素——問(wèn)題,解決方案和環(huán)境。39擎孫竅騰莖霞秋莢鏟癢多噪膊疹惶職逼甩詭闡朽踴崩豺武懶瑣濱仰紋契僅面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(1)設(shè)計(jì)模式的概念(designpattern)Ale39(1)設(shè)計(jì)模式的概念(designpattern)設(shè)計(jì)模式(designpattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無(wú)疑問(wèn),設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的,設(shè)計(jì)模式使代碼編制真正工程化,設(shè)計(jì)模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。ErichGamma,RichardHelm,RalphJohnson&JohnVlissides四人的《設(shè)計(jì)模式》(1995年出版)是第一次將設(shè)計(jì)模式提升到理論高度,并將之規(guī)范化。提出了23種基本設(shè)計(jì)模式,自此,在可復(fù)用面向?qū)ο筌浖陌l(fā)展過(guò)程中,新的大量的設(shè)計(jì)模式不斷出現(xiàn)。40矛滌傣享午煮狙偉沛琵圍訊刀狗鈔搪渣陡娠籠技挨消揚(yáng)籮團(tuán)教溉忽吏視蛙面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(1)設(shè)計(jì)模式的概念(designpattern)設(shè)計(jì)模40模式名問(wèn)題情景約束(2)模式的組成元素解決方案例子結(jié)果情景41壁茁拘陪莢宋察簾殼嚇靠笆湘揍劣艱婆氨咨蠻丹酬箱咎露酶土廣怯擒彭洪面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-模式名(2)模式的組成元素解決方案41壁茁拘陪莢宋察簾殼嚇41(3)設(shè)計(jì)模式的分類42創(chuàng)建模式:對(duì)類的實(shí)例化過(guò)程的抽象。一些系統(tǒng)在創(chuàng)建對(duì)象時(shí),需要?jiǎng)討B(tài)地決定怎樣創(chuàng)建對(duì)象,創(chuàng)建哪些對(duì)象,以及如何組合和表示這些對(duì)象。創(chuàng)建模式描述了怎樣構(gòu)造和封裝這些動(dòng)態(tài)的決定。包含類的創(chuàng)建模式和對(duì)象的創(chuàng)建模式。結(jié)構(gòu)模式:描述如何將類或?qū)ο蠼Y(jié)合在一起形成更大的結(jié)構(gòu)。分為類的結(jié)構(gòu)模式和對(duì)象的結(jié)構(gòu)模式。類的結(jié)構(gòu)模式使用繼承把類,接口等組合在一起,以形成更大的結(jié)構(gòu)。類的結(jié)構(gòu)模式是靜態(tài)的。對(duì)象的結(jié)構(gòu)模式描述怎樣把各種不同類型的對(duì)象組合在一起,以實(shí)現(xiàn)新的功能的方法。對(duì)象的結(jié)構(gòu)模式是動(dòng)態(tài)的。行為模式:對(duì)在不同的對(duì)象之間劃分責(zé)任和算法的抽象化。不僅僅是關(guān)于類和對(duì)象的,并是關(guān)于他們之間的相互作用。類的行為模式使用繼承關(guān)系在幾個(gè)類之間分配行為。對(duì)象的行為模式則使用對(duì)象的聚合來(lái)分配行為。恥鉤倒幾因蔥陷捂處閉曹鉚倦箍側(cè)麗近鈣瞅絳蠟廟嫌床盯恍議閹東崖炳凡面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(3)設(shè)計(jì)模式的分類42創(chuàng)建模式:對(duì)類的實(shí)例化過(guò)程的抽象。42AbstractFactory:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)須指定它們具體的類。Builder:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。FactoryMethod:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。使一個(gè)類的實(shí)例化延遲到其子類。Prototype:用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。Singleton:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。創(chuàng)建型模式43棍者泄輻震孤茍師拘捍抱按都撬繹攬尉豈香實(shí)閉減大旅佑海僻攤鑿男隨勃面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-AbstractFactory:提供一個(gè)創(chuàng)建一系列相關(guān)或相43結(jié)構(gòu)型模式Adapter:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。Bridge:將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。Composite:將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Decorator:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。Fa?ade:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)acade模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。Flyweight:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。Proxy:為其它對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。44流區(qū)熟哼絢段維春汛瓶橋毋喬支礬漚貿(mào)虜灰抬回費(fèi)遠(yuǎn)筷確送剁鈕扼焦殉免面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-結(jié)構(gòu)型模式Adapter:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外44ChainofResponsibility:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。Command:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤消的操作。Interpreter:給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來(lái)解釋語(yǔ)句中的句子。Iterator:提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中的各個(gè)元素,而不需要暴露該對(duì)象的內(nèi)部表示。Mediator:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。行為型模式45鳥(niǎo)爸樹(shù)旨南餅父新氨滿摟靛是比飛龔次哎鬼粹號(hào)謅逃氧楚慣鴕甘袒癰釉揣面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-ChainofResponsibility:使多個(gè)對(duì)象都45行為型模式Memento:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。Observer:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)更新。State:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。Strategy:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可以相互替換。TemplateMethod:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。Visitor:表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作。46蝴義圭黨茶拴賜礙黔匠分截鶴晉澤袖呼胯詩(shī)士謠三熏椒鴻疏各魚(yú)然羅辣槐面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-行為型模式Memento:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)46(4)設(shè)計(jì)模式的關(guān)系47魯額諒篩接鄂哆巾衰頂栗倉(cāng)寸過(guò)懊悶綴舉亢挽浚毒鰓幌危數(shù)循現(xiàn)地提崔果面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(4)設(shè)計(jì)模式的關(guān)系47魯額諒篩接鄂哆巾衰頂栗倉(cāng)寸過(guò)懊悶綴47(5)介紹職責(zé)分配中通用原則的模式描述將職責(zé)分配給對(duì)象的基本原則。
專家(Expert)創(chuàng)建者(Builder)高聚合度或高內(nèi)聚(Highcohesion)低耦合度或低耦合(Lowcoupling)控制者(Controller)五個(gè)模式將分析階段漏掉的類型加入到對(duì)象模型中。48屯熒運(yùn)歉薪銘駱登敝卸琉凜肖貴賬猛比公渠盒尸香籮鈕環(huán)廖番緊骯儉廣濟(jì)面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(5)介紹職責(zé)分配中通用原則的模式描述將職責(zé)分配給對(duì)象48
解決方案:將一個(gè)職責(zé)分配給信息專家。
問(wèn)題:面向?qū)ο蟮脑O(shè)計(jì)中什么是最基本的職責(zé)分配原則。
專家
49墻羹者失錘賤袖紹絢泰給餒球繡賓問(wèn)芬計(jì)賴龍灰催弧穎茶賃柑妮餡咖淫貝面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-解決方案:將一個(gè)職責(zé)分配給信息專家。專家49墻羹者失錘49SaleDatetimequantitySalesLineItemdescriptionpriceUpcProductspecification1..*Contains(包含)*DescribedbySale(銷售)類職責(zé)知道銷售總額SalesLineItem(銷售細(xì)項(xiàng))知道銷售項(xiàng)記錄了金額ProductSpecification(產(chǎn)品說(shuō)明)知道商品價(jià)格
確定銷售總額(grandtotal)需要知道什么信息?圖4-82Sale類的類圖銷售系統(tǒng)50棒桔古拎顯關(guān)雁熾猶赦增盲委諄繃它氯堂鞠秋務(wù)泊乙霸顴夏省勛瀾舀凱墑面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-SaleDatequantitySalesdescripti50Sli:SalesLineItem
2:st=substotal():ProductSpecification2.1:p:=price()1*:[foreach]sli:=next():Salet:=total():SalesLineItem圖4-83計(jì)算Sale總額SaledateTimetotal()SalesLineItemQuantitysubtotal()ProductSpecificationdescriptionPriceUPCprice()51小豫模笑喚強(qiáng)叉冬帽氫剝擊擦晨似胡星油閑毆瑯?lè)蚺Vx巢喀躥絹聽(tīng)莊障決面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-Sli:SalesLineItem2:st=subst51說(shuō)明:專家模式表明了“對(duì)象所能完成的工作要依賴于它所掌握的信息。為了履行職責(zé)需要獲取散布在不同對(duì)象中的信息。表明系統(tǒng)中存在許多“部分”專家,在完成任務(wù)時(shí)需要它們的協(xié)作。軟件對(duì)象之間的合作就像人之間的合作一樣。對(duì)象所做的事情與它們所知道的信息相關(guān)?!鞍沿?zé)任交給數(shù)據(jù)”;“誰(shuí)知道誰(shuí)來(lái)干”;“自己做”;“把服務(wù)推給要操作的屬性”。封裝性好;高內(nèi)聚。52賢森盼楔滅衫引鎬但籠便從仍銜然縮嶼涵擲卞帖胯纜蕊綿額旭莽京凝死魯面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-說(shuō)明:專家模式表明了“對(duì)象所能完成的工作要依賴于它所掌握的信52Builder模式:用于指導(dǎo)對(duì)象實(shí)例創(chuàng)建任務(wù)的分配。將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。創(chuàng)建者(Builder)模式Builder模式是一步一步創(chuàng)建一個(gè)復(fù)雜的對(duì)象,它允許用戶可以只通過(guò)指定復(fù)雜對(duì)象的類型和內(nèi)容就可以構(gòu)建它們。用戶不知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。Builder模式是非常類似抽象工廠模式,細(xì)微的區(qū)別大概只有在反復(fù)使用中才能體會(huì)到。53煞褲睡弱樂(lè)領(lǐng)除侵氈甸迫教矚鍛贈(zèng)麓糾淌需氮聚骸寵替牟枉訝檀曾挽賺資面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-Builder模式:創(chuàng)建者(Builder)模式Builde53是為了將構(gòu)建復(fù)雜對(duì)象的過(guò)程和它的部件解耦。注意:是解耦過(guò)程和部件。因?yàn)橐粋€(gè)復(fù)雜的對(duì)象,不但有很多大量組成部分,如汽車,有很多部件:車輪方向盤(pán)發(fā)動(dòng)機(jī)還有各種小零件等等,部件很多,如何將這些部件裝配成一輛汽車,這個(gè)裝配過(guò)程也很復(fù)雜(需要很好的組裝技),Builder模式就是為了將部件和組裝過(guò)程分開(kāi)。用于指導(dǎo)對(duì)象實(shí)例創(chuàng)建任務(wù)的分配。為何使用?54創(chuàng)建者(Builder)模式捶駱函尾堡盔犢看啡咒酚均尚朋翱捶伸羽鍵侶樂(lè)禹瓣滄龐茸豆褐友磋若朵面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-是為了將構(gòu)建復(fù)雜對(duì)象的過(guò)程和它的部件解耦。為何使用54方案:將創(chuàng)建一個(gè)類A的實(shí)例的職責(zé)指派給類B的實(shí)例,若下列條件滿足:B是A對(duì)象的創(chuàng)建者。
B聚集了A對(duì)象B包含了A對(duì)象B記錄了A對(duì)象的實(shí)例B要經(jīng)常使用A對(duì)象當(dāng)A的實(shí)例被創(chuàng)建時(shí),B具有要傳遞給A的初始化數(shù)據(jù)如何使用?55創(chuàng)建者(Builder)模式避霓意燼煽慧猩郡彭剮暗汛寶塢吶謹(jǐn)盎癢陌瑯亞領(lǐng)芥盎腮澀候灶薪褥趙路面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-方案:將創(chuàng)建一個(gè)類A的實(shí)例的職責(zé)指派給類BB聚集了A對(duì)象如55創(chuàng)建者(Builder)模式Builder模式結(jié)構(gòu):56蛀械徹巒壟疆致彤供稅袱牧扳蹬散葬問(wèn)瀕極丁汲疾擎喂趴覽毛囑鐐概川惺面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-創(chuàng)建者(Builder)模式Builder模式結(jié)構(gòu):56蛀械56創(chuàng)建者(Builder)模式Builder模式結(jié)構(gòu):Builder:為創(chuàng)建一個(gè)Product對(duì)象的各個(gè)部件指定抽象接口。ConcreteBuilder:實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件;定義并明確它所創(chuàng)建的表示;提供一個(gè)檢索產(chǎn)品的接口。Director:構(gòu)造一個(gè)使用Builder接口的對(duì)象。Product:表示被構(gòu)造的復(fù)雜對(duì)象;包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。57竄狙揀循葬搖涂喂陣芽戎皋矛溜躁傭狂產(chǎn)痙這煤漓胡冬貼糧剮延齡背俐鞏面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-創(chuàng)建者(Builder)模式Builder模式結(jié)構(gòu):Buil57在Java實(shí)際使用中,經(jīng)常用到“池”(Pool)的概念,當(dāng)資源提供者無(wú)法提供足夠的資源,并且這些資源需要被很多用戶反復(fù)共享時(shí),就需要使用池?!俺亍睂?shí)際是一段內(nèi)存,當(dāng)池中有一些復(fù)雜的資源的“斷肢”(比如數(shù)據(jù)庫(kù)的連接池,也許有時(shí)一個(gè)連接會(huì)中斷),如果循環(huán)再利用這些“斷肢”,將提高內(nèi)存使用效率,提高池的性能。修改Builder模式中Director類使之能診斷“斷肢“斷在哪個(gè)部件上,再修復(fù)這個(gè)部件。應(yīng)用:58寨宦劣喲舟架視責(zé)滿轎桃趁趴蛛毅陀臘域免耽扇捎州粵嗆殲凄捌纏蝎篇椒面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-在Java實(shí)際使用中,經(jīng)常用到“池”(Pool)的概念,當(dāng)資58圖4-84創(chuàng)建一個(gè)SalesLineItem的實(shí)例
:Sale:SalesLineItem1:create(quantity)makelineItem(quantity)datetimeSalemakeLineItem()total()新方法在銷售點(diǎn)應(yīng)用中,哪個(gè)類負(fù)責(zé)創(chuàng)建一個(gè)SaleLineItem實(shí)例?根據(jù)創(chuàng)建者模式,應(yīng)當(dāng)找出一個(gè)類,這個(gè)類聚集、包含了SaleLineItem的實(shí)例。實(shí)例:59桌紉翹琶筐壽希揖蔽紛未石竣吹欺祿粘懸聰水籃頹方標(biāo)兩嗡倔藐?duì)C底驕需面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-圖4-84創(chuàng)建一個(gè)SalesLineItem的實(shí)例:Sa59結(jié)論:創(chuàng)建者模式,用于指導(dǎo)實(shí)例的創(chuàng)建任務(wù)分配,要找到一個(gè)與被創(chuàng)建對(duì)象之間有關(guān)聯(lián)關(guān)系的創(chuàng)建者。職責(zé)的確定和分配在繪制協(xié)作圖的語(yǔ)境中進(jìn)行。職責(zé)的履行由方法調(diào)用來(lái)具體實(shí)現(xiàn)。創(chuàng)建者模式說(shuō)明聚合/包容器類/記錄類是一個(gè)承擔(dān)創(chuàng)建被包含或被記錄的事物職責(zé)好的候選者。60靛隸通霧熾花劑蹈整左打長(zhǎng)疾悟嘯蹦么揉栽城月酮喬危趾變皆澈汕馱減埃面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-結(jié)論:創(chuàng)建者模式,用于指導(dǎo)實(shí)例的創(chuàng)建任務(wù)分配,要找到一個(gè)與被60
解決方案:在分配一個(gè)職責(zé)時(shí),要保持低耦合度。問(wèn)題:如何支持低依賴關(guān)系和增加重用。低耦合度模式61民謂欄港氰朽佯鉀州屎毛規(guī)斑瓊心沉憫飛關(guān)晤祈蔡深喧檢車婚湍散繪膳洗面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-解決方案:在分配一個(gè)職責(zé)時(shí),要保持低耦合問(wèn)題:如何支持低61例如:從銷售終端應(yīng)用系統(tǒng)中抽取如下三個(gè)類
Sale實(shí)例創(chuàng)建payment的實(shí)例(方案2):Post:Payment:Sale1:makePayment()makePayment()1.1:create()圖4-87Sale實(shí)例創(chuàng)建payment實(shí)例
Post實(shí)例創(chuàng)建Payment的實(shí)例(方案1):PostP:Payment:Sale1:Create()makePayment()2:addpayment(p)圖4-86Post實(shí)例創(chuàng)建payment實(shí)例PaymentPostSale圖4-85銷售終端系統(tǒng)部分類62顆守鉻吩膝斷路吱擲瞎搖鴛蹋哼將溪曼辦仕埔闖士聽(tīng)繼魔娶旁悠侖也裳羔面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-例如:從銷售終端應(yīng)用系統(tǒng)中抽取如下三個(gè)類Sale實(shí)例創(chuàng)建62在C++、Java中從類型X到類型Y的耦合有:#類型X有一個(gè)屬性(數(shù)據(jù)成員或?qū)嵗兞?引用類型Y的實(shí)例或類型Y本身#類型X有一個(gè)方法以各種方式引用了一個(gè)類型Y的實(shí)例或類型Y本身(Y的局部變量或參數(shù)),或從一個(gè)消息返回的對(duì)象是類型Y的實(shí)例。
#類型X是類型Y的一個(gè)直接的或間接的子類。#類型Y是一個(gè)接口,類型X實(shí)現(xiàn)了這個(gè)接口。說(shuō)明:63滌榜寫(xiě)步躁件殆構(gòu)閥斷樓逮賒擰緒回草曉鉸近聊棍著君膝枯醒篇立腐圣寧面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-在C++、Java中從類型X到類型Y的耦合有:#類型X有63低耦合度在設(shè)計(jì)過(guò)程中是要記住的一個(gè)原則,它是一個(gè)時(shí)刻要注意的隱含設(shè)計(jì)目標(biāo)。說(shuō)明:低耦合度支持更獨(dú)立的類設(shè)計(jì),支持重用,如果不以重用為目的,耦合就不重要了。低耦合度支持更獨(dú)立的類設(shè)計(jì),支持重用,如果不以重用為目的,耦合就不重要了。不能孤立地考慮低耦合度,與專家、高內(nèi)聚模式有關(guān)。完全沒(méi)有耦合的設(shè)計(jì)也是不可取的,類之間應(yīng)當(dāng)保持中等程度的耦合是合理的。64術(shù)仟吞狡易拌待脈梨雜熬柄道斃姓常戒拎羞枷蟄詣啪掇枕醋姿奧逸峙溜憑面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-低耦合度在設(shè)計(jì)過(guò)程中是要記住的一個(gè)原則,它是一個(gè)時(shí)刻要注意的64解決方案:在分配一個(gè)職責(zé)時(shí),要保持高度聚合。問(wèn)題:如何將復(fù)雜性保持在可控制范圍內(nèi)?高聚合度模式65恭畢汞姥喂顛劫懼晚痘年砌馳澗悄載做草豬沽嫂購(gòu)賴斌鞏馬絕誹矛蕾新掌面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-解決方案:在分配一個(gè)職責(zé)時(shí),要保持高度聚問(wèn)題:如何將復(fù)雜65代表整個(gè)“系統(tǒng)”的類代表整個(gè)企業(yè)或組織的類代表真實(shí)世界中參與職責(zé)(角色控制者)的主動(dòng)對(duì)象類代表一個(gè)用況中所有事件的人工處理者類解決方案:將處理系統(tǒng)事件消息的職責(zé)分派給代表下列事物的類??刂普?6駒逝匿西瓊扇漚尿鋪咽冤恭餡碉寇募娥擇胚窖駒褂昏圓仍泵奈煤假泅迄您面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-代表整個(gè)“系統(tǒng)”的類解決方案:將處理系統(tǒng)事件消息的職責(zé)分派66控制者問(wèn)題:誰(shuí)來(lái)負(fù)責(zé)處理一個(gè)系統(tǒng)事件?系統(tǒng)事件(systemevent)
由某個(gè)參與者發(fā)起的指向系統(tǒng)的輸入事件系統(tǒng)操作(systemoperation)
系統(tǒng)響應(yīng)這些事件而執(zhí)行的操作控制者(controller)
控制者定義了系統(tǒng)操作的方法67茬則兼燎幻拭玩直媽羹訟騎年瑪痞雖諧厚吧罰槍頌氯雅梢沽煉褐琺疽晦遜面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-控制者問(wèn)題:誰(shuí)來(lái)負(fù)責(zé)處理一個(gè)系統(tǒng)事件?系統(tǒng)事件(syst67:SystementerItem(UPC,quantity)enterItem為系統(tǒng)事件,觸發(fā)了一個(gè)同名的系統(tǒng)操作,系統(tǒng)操作帶有參數(shù)。事件是命名的動(dòng)因;操作是對(duì)動(dòng)因的響應(yīng)。圖4-88系統(tǒng)事件68釋幅鼠僥語(yǔ)踢辮吵逸模惑蹭鵝隙饑動(dòng)膀媳沈蝗落剿寶津詐譽(yù)娛貞撈悟倡柴面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-:SystementerItem(UPC,quantity)68:SystementerItem(UPC,quantity)enterKerPressed(UPC,quantity)較差的名稱較好的名稱對(duì)操作的命名:要抽象出最高層次或使用操作的最終目標(biāo)耒對(duì)操作的命名。圖4-89在比較抽象層次上對(duì)事件和操作命名如對(duì)一個(gè)記錄支付信息的操作命名如下:enterAmountTendered(amount)較差enterPayment(amount)較好makePayment(amount)更好一些69薩企鱗累古公霜摸栓絢轄鹿俘眨古粳犁爐蔫俄橙一毋央羹或窖司陸慫誓筐面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-:SystementerItem(UPC,quantity)69例如:在銷售終端系統(tǒng)應(yīng)用中的系統(tǒng)操作
SystemendSale()enterItem()makePayment圖4-90一個(gè)名為System類型中的系統(tǒng)操作這個(gè)圖與概念模型的區(qū)別:概念模型中的元素是真實(shí)世界中的概念,顯示的只是靜態(tài)信息。System類型像人為的概念,描述系統(tǒng)行為,動(dòng)態(tài)信息。70捆亥慧哩肌差喻盧奄擻出噸簿撕蓬楷孩滅痰窘鍵功敞少料豹盛行逾作氈仆面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-例如:在銷售終端系統(tǒng)應(yīng)用中的系統(tǒng)操作SystemendSa70
代表整個(gè)系統(tǒng)的類代表整個(gè)企業(yè)組織者的類代表真實(shí)世界參與職責(zé)的主動(dòng)對(duì)象類代表一個(gè)用況中所有事件的人工處理類哪個(gè)類對(duì)象應(yīng)該是系統(tǒng)事件的控制者?根據(jù)控制者模式,可選擇system:postendsale()enterItem()makepayment圖4-91系統(tǒng)操作的分配enterItem(upc,quantity):postenterItem(upc,quantity):storeenterItem(upc,quantity):cashierenterItem(upc,quantity):BuyItemsHandler71煥恒枯薦純趁意危塌格鉗線據(jù)霹彩杖盎果玫宵脯翰闊累炎崗?fù)呔俳绱难嗝嫦驅(qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-代表整個(gè)系統(tǒng)的類哪個(gè)類對(duì)象應(yīng)該是系統(tǒng)事件的控制者?根據(jù)控71說(shuō)明:無(wú)論采用何種輸入手段,必須由控制者來(lái)處理系統(tǒng)輸入事件。一個(gè)用況中的所有系統(tǒng)事件都應(yīng)由同一個(gè)控制者來(lái)處理,這樣才能維持一個(gè)用況的狀態(tài)信息?!跋到y(tǒng)類”是虛包的控制者,把它看成是整個(gè)系統(tǒng)代表或一個(gè)物理單元。只有當(dāng)不能將系統(tǒng)事件消息發(fā)向替代的控制者時(shí)才使用虛包類??刂普哳愐膊荒艹袚?dān)過(guò)多的職責(zé)。注意角色控制的使用:
所創(chuàng)建的角色易出現(xiàn)低聚合的危險(xiǎn);不要使角色像人一樣承擔(dān)了所有工作。72哭街另盼斗賞淤焊各聰縛寺摘吏謠繹回鄉(xiāng)勿盯卞攣斌郭姜牟郝力鑄閃儡全面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-說(shuō)明:無(wú)論采用何種輸入手段,必須由控制者來(lái)處理系統(tǒng)輸入事件。72
例如:從表示層到領(lǐng)域?qū)拥鸟詈?/p>
Objectstore
UPCQuantityTotalTenderedBalanceEnterItemEndSaleMakePayment出納員:Postapplet:Post:SaleonEenterItem()1:enterItem(upc,qty)1.1:makeLineItem(upc,qty)系統(tǒng)事件消息控制者表示層(JavaApplet)領(lǐng)域?qū)印羅圖4-92從表示層到領(lǐng)域?qū)拥鸟詈?3儈婦醒媚桐料業(yè)濺彝崎培器墊詳割惹戳炊束殿犬簾扎鋒首螟籌氫購(gòu)錠蹄恩面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-例如:從表示層到領(lǐng)域?qū)拥鸟詈螼bjectstore734.4.5檢查系統(tǒng)設(shè)計(jì)74(1)檢查“正確性”(2)檢查“一致性”(3)檢查“完整性”(4)檢查“可行性”艾鎖世脈寓彰斂夢(mèng)棟卸誠(chéng)硝伯說(shuō)充點(diǎn)埃恨棒掉拍摯瓶踴脅謊瓢鴕誡友篩巡面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-4.4.5檢查系統(tǒng)設(shè)計(jì)74(1)檢查“正確性”(2)74(1)檢查“正確性”每個(gè)子系統(tǒng)都能追溯到一個(gè)用例或一個(gè)非功能需求嗎?每一個(gè)用例都能映射到一個(gè)子系統(tǒng)嗎?系統(tǒng)設(shè)計(jì)模型中是否提到了所有的非功能需求?每一個(gè)參與者都有合適的訪問(wèn)權(quán)限嗎?系統(tǒng)設(shè)計(jì)是否與安全性需求一致?75豎樸錨盯遣朗蝎京乍單崖恢蔗所齒硒朗涎呀雜鏡胃酗圍毯譴碾讕漱褥賴爭(zhēng)面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(1)檢查“正確性”每個(gè)子系統(tǒng)都能追溯到一個(gè)用例或一個(gè)非功75是否將沖突的設(shè)計(jì)目標(biāo)進(jìn)行了排序?是否有設(shè)計(jì)目標(biāo)違背了非功能需求?是否存在多個(gè)子系統(tǒng)或類重名?(2)檢查“一致性”76廖奧金館囤授齲酮召胳蒼累碧佯霜瘡喉辛釁萬(wàn)冰濱措梯盒禹篆郁才今酌乍面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-是否將沖突的設(shè)計(jì)目標(biāo)進(jìn)行了排序?(2)檢查“一致性”76廖76是否處理邊界條件?是否有用例走查來(lái)確定系統(tǒng)設(shè)計(jì)遺漏的功能?是否涉及到系統(tǒng)設(shè)計(jì)的所有方面(如硬件部署、數(shù)據(jù)存儲(chǔ)、訪問(wèn)控制、遺留系統(tǒng)、邊界條件)?是否定義了所有的子系統(tǒng)?(3)檢查“完整性”77醚疥蓋灰衣維囊姆痛遣菇董征蝗臭逸作蕾饅琉噶州捐坑螢措翔巡敬壹凋嚨面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-是否處理邊界條件?(3)檢查“完整性”77醚疥蓋灰衣維囊姆77系統(tǒng)中是否使用了新的技術(shù)或組件?是否對(duì)這些技術(shù)或組件進(jìn)行了可行性研究?在子系統(tǒng)分解環(huán)境中檢查性能和可靠性需求了嗎?考慮并發(fā)問(wèn)題了嗎?78(4)檢查“可行性”臃角燥鹿兵蹄潘藉浩栗淋雕烘級(jí)佰夠臍晾資君踏冪隴罪爐焊養(yǎng)胃次擋母呵面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-系統(tǒng)中是否使用了新的技術(shù)或組件?是否對(duì)這些技術(shù)或組件進(jìn)行了可781)邏輯結(jié)構(gòu)和物理結(jié)構(gòu)的設(shè)計(jì);2)對(duì)象設(shè)計(jì)
屬性的優(yōu)化關(guān)聯(lián)的優(yōu)化使用設(shè)計(jì)模式確定和優(yōu)化操作79總結(jié)1.設(shè)計(jì)階段要做的工作緬暈蹈灶捅暴脅胺徽歌呸險(xiǎn)斥瓶當(dāng)計(jì)癰糧敏言翟榆綠環(huán)作耀宴嗎置渴素酥面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-1)邏輯結(jié)構(gòu)和物理結(jié)構(gòu)的設(shè)計(jì);79總結(jié)1.設(shè)計(jì)階段要做79總結(jié)2.面向?qū)ο蟮脑O(shè)計(jì)原則1)采用了模型化的觀點(diǎn);2)
使用了抽象、封裝、繼承等機(jī)制;3)模塊化機(jī)制:交互耦合、繼承耦合;服務(wù)內(nèi)聚、類內(nèi)聚;4)可重用機(jī)制、靈活性機(jī)制、可移植性機(jī)制。80嫌阮謹(jǐn)抑嶺駝腕鵬倪玫害裳勺虛備翔苫釩儡藏拽牌競(jìng)瑣業(yè)武剿替冤鋒川瘧面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-總結(jié)2.面向?qū)ο蟮脑O(shè)計(jì)原則1)采用了模型化的觀點(diǎn);2)80使設(shè)計(jì)泛化;提高抽象,提高內(nèi)聚性,降低耦合的設(shè)計(jì)原則;設(shè)計(jì)要包含鉤子,使他人可添加功能;簡(jiǎn)化設(shè)計(jì)。注意:克隆(clone)并不能看作是重用??寺∈菍⒋a從一個(gè)地方復(fù)制到另一個(gè)地方。提高可重用性設(shè)計(jì)的策略81褒仗棠皿若貢畝德吁灶忙簾剖壕輛脈琶顆降竿腕此贛慣疹訊垛塌歧怨窗良面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-使設(shè)計(jì)泛化;提高可重用性設(shè)計(jì)的策略81褒仗棠皿若貢畝德吁灶81@提高內(nèi)聚性,降低耦合。@不要將代碼寫(xiě)死。應(yīng)消除代碼中的常量。應(yīng)在服務(wù)器啟動(dòng)時(shí)從配置文件中讀取最大值或向用戶提供一個(gè)選項(xiàng)對(duì)話框,可修改該值。@建立抽象。建立多態(tài)操作的接口和超類,功能易擴(kuò)展。@打開(kāi)所有選項(xiàng)。方法中有異常時(shí),應(yīng)拋出異常,而不是執(zhí)行特定動(dòng)作處理該異常。@使用并創(chuàng)建可重用代碼。提高靈活性設(shè)計(jì)的策略82攬僧宴班慫弛鑄鄭肛沮路勿松沿踐咀另瀕淵諧邪賠顴自象幣享巡臍慮隕劇面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-@提高內(nèi)聚性,降低耦合。@不要將代碼寫(xiě)死。應(yīng)消除代碼中的82#避免使用特定環(huán)境的專有功能。#語(yǔ)言的一些功能依賴于硬件體系結(jié)構(gòu)(C++)要知道一個(gè)字中字符的順序,以及整型變量的位數(shù)。
#類庫(kù)也存在著差別(Java)。
#移植性問(wèn)題與文本文件有關(guān),各種平臺(tái)中用來(lái)終止一行的字符都不盡相同。提高可移植性設(shè)計(jì)的策略83蔥懂枝串偽薪苔冠涼鮮宇憲嘴棘惹耗須仟責(zé)涉析污耙瞇篷總慎鴉逃丟威琶面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-#避免使用特定環(huán)境的專有功能。#語(yǔ)言的一些功能依賴于硬件83圖4-93類的實(shí)現(xiàn)順序POSTendSale()enterItem()makePayment()SalesLineitemquantity:Integersubtotal()Saledate:DateisComplete:Booleantime:TimebecomeComplete()makeLineItem()makePayment()Total()address:Addressname:TextaddSale()
StorePaymentamount:Quantity
ProductCatalogspecification()ProductSpecificationdescription:Textprice:Quantityupc:UPCHouses11Uses11Looks-in111..*1ContainsCaptures1111..*Contains1Describes*11Paid-by*1Loge-completed11234567總結(jié)3.設(shè)計(jì)的結(jié)果--面向?qū)崿F(xiàn)的類圖84叫薦醉運(yùn)號(hào)戶咎駐反沼烴邢始攘拜戈惠鼓君饒圭恤豁晌凄昏仔下遂衡棺累面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-圖4-93類的實(shí)現(xiàn)順序POSTSales84packagepost;publicclassPayment{privatefloatamount;publicpayment(floatcashTendered){this.amount=cashTendered;}publicfloatgetAmount(){returnamount;}}ClassPayment85沸香冠順日鍵輻葛尸下絞鄉(xiāng)洋嗽亡締疾剃擯胡磚妒詭剁瞧爆效烘踏衣援騾面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-packagepost;ClassPayme85packagepost;publicclassProductSpecification{privateintupc=0;privatefloatprice=0;privateStringdescription=“”;publicProductSpecification(intupc,floatprice,Stringdescription){this.upc=upc;this.price=pricethis.description=description;}publicintgetUPC(){returnupc;}publicfloatgetPrice(){returnprice;}publicStringgetDescription(){returndescription;}}ClassProductSpecification86凜散股墟翌靖煥模鐵擲搖腋喳猖蟬憋商柏懂寞墻狐撻屢娘牲番焉掀春款它面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-packagepost;ClassProduc86
對(duì)象設(shè)計(jì)的主要任務(wù):精化類的屬性和操作明確類之間的關(guān)系整理和優(yōu)化設(shè)計(jì)模型4.4對(duì)象設(shè)計(jì)第4章面向?qū)ο蟮脑O(shè)計(jì)87松惰剝碗比菲迪糠紊務(wù)峻鱗背瓜獎(jiǎng)綠熄鄭擁姨撈溉吐躥初倆門(mén)扁仔晚胃埋面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-對(duì)象設(shè)計(jì)的主要任務(wù):4.4對(duì)象設(shè)計(jì)第4章面向87
4.4.1對(duì)類的屬性的處理4.4.4應(yīng)用設(shè)計(jì)模式定義操作4.4.2關(guān)聯(lián)的設(shè)計(jì)4.4.3對(duì)結(jié)構(gòu)的優(yōu)化4.4.5檢查系統(tǒng)設(shè)計(jì)88內(nèi)容勻嚙顱特搔塔舶忍卷畦臨腕站棵搜族顆特白比蹬弊柜剛糟枉籬戰(zhàn)僳織瘟垣面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-4.4.1對(duì)類的屬性的處理4.4.4應(yīng)用設(shè)計(jì)模式定884.4.1對(duì)類的屬性的處理(1)回顧屬性的來(lái)源(2)成員細(xì)節(jié)的表示89(3)在哪里展示非簡(jiǎn)單數(shù)據(jù)類型和純數(shù)據(jù)值?
(4)對(duì)屬性的數(shù)量和單位建模(5)對(duì)屬性的處理(6)外部鍵的屬性咒顴琶疽平劉息輿馳郎湍酌憊甭忙稅奧攏亭蹭捧瘧窄札騷童癬粗偷被健斃面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-4.4.1對(duì)類的屬性的處理(1)回顧屬性的來(lái)源(2)89(1)回顧屬性的來(lái)源類所代表的現(xiàn)實(shí)實(shí)體的基本信息;描述狀態(tài)的信息;派生屬性(derivedattribute)如:類CourseOffering中的“學(xué)生數(shù)目”/numStudents:int描述該類與其他類之間關(guān)聯(lián)的信息;其他常見(jiàn)的類型:
地址Address、顏色Color、幾何元素Geometrics、電話號(hào)碼PhoneNumber、通用商品代碼UPC、社會(huì)安全代碼SocialSecurityNumber、郵政編碼PostalCode、枚舉類型等。90收時(shí)囑毗京普炮雙瞞壞當(dāng)桓閘尾城嚼釋銜臘裕鵬申該軌限臘敘滔磺國(guó)德愈面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(1)回顧屬性的來(lái)源類所代表的現(xiàn)實(shí)實(shí)體的基本信息;描述狀態(tài)90具體說(shuō)明屬性的名稱、類型、缺省值、可見(jiàn)性等;Public:‘+’;Private:‘-’;Protected:‘#’。(2)成員細(xì)節(jié)的表示基本原則盡可能將所有屬性的可見(jiàn)性設(shè)置為private;僅通過(guò)set方法更新屬性;僅通過(guò)get方法訪問(wèn)屬性。圖4-56有細(xì)節(jié)的類圖91燃由硼豫漆羽翼劉莖倘接箭輥家半坑遙妻雇嶺多鉗倒眺葦占價(jià)定囑份排辮面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(2)成員細(xì)節(jié)的表示基本原則圖4-56有細(xì)節(jié)的類圖5燃由91(3)在哪里展示非簡(jiǎn)單數(shù)據(jù)類型和純數(shù)據(jù)值?
ProductSpecificationupc:UPCStoreAddress:AddressProductSpecificationUPC*1StoreAddress*1UPC是非簡(jiǎn)單數(shù)據(jù)類型(要對(duì)它進(jìn)行驗(yàn)證,也可包括制造者屬性),即有屬性和關(guān)聯(lián),也可用概念來(lái)表示。UPC是純數(shù)據(jù)值,在概念模型中當(dāng)作屬性看待。
圖4-57用概念表示屬性UPC是一個(gè)純數(shù)據(jù)值,但也可以是一個(gè)非簡(jiǎn)單數(shù)據(jù)類型。92逸岡舞推踢三萎弛攬獎(jiǎng)汲騙縣棘悶以銥霧虹梅竿勘賜稠宏甭盒亨敞偉論躍面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(3)在哪里展示非簡(jiǎn)單數(shù)據(jù)類型和純數(shù)據(jù)值?Product92(4)對(duì)屬性的數(shù)量和單位建模Paymentamount:NumberPaymentQuantityamount:Number*1Paymentamount:Quantity數(shù)量是純數(shù)據(jù)值,可作為屬性這個(gè)表示可用,但不靈活或不可靠,要知道支付貨款時(shí)所用的貨幣單位。
UnitHas-amountIs-in*1將數(shù)量作為一個(gè)單獨(dú)概念圖4-58對(duì)屬性的數(shù)量和單位建模93熄瓷炕巨要諸心熬南毅狙幻博捅準(zhǔn)鎢屁駿巨窿濫陌剖毅彩庶緯只湘凈撇擻面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(4)對(duì)屬性的數(shù)量和單位建模PaymentPaymentQ93(5)對(duì)屬性的處理保留派生屬性,避免重復(fù)計(jì)算描述其他事物的規(guī)格說(shuō)明Flight航班datanumbertimeAirport機(jī)場(chǎng)nameFlies-to*1Flight航班datatimeDescribed-by*1Airport機(jī)場(chǎng)nameFlightDescriptionnumber*1Describes-flights-to較好圖4-59描述其他事物的規(guī)格說(shuō)明較差
94悸鉆閨鼠撒恨寨引放誤藥茍椅死渾硅娠議呼數(shù)忙似疽淀背擄砂源磋驟淳瓊面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-(5)對(duì)屬性的處理保留派生屬性,避免重復(fù)計(jì)算描述其他事94分析階段的數(shù)據(jù)類型只能是簡(jiǎn)單的、原始的數(shù)據(jù)類型,并不表示如C++、Java、Smalltalk中的屬性(數(shù)據(jù)成員、實(shí)例變量)
(分析中的類圖是對(duì)問(wèn)題的存在建立的分析模型,而不是軟件實(shí)體的分析模型)。在軟件構(gòu)造和設(shè)計(jì)階段,對(duì)象之間的關(guān)聯(lián)通常是用指向其他復(fù)雜類型的屬性來(lái)表示(但不是唯一的解決方案)。(6)外部鍵的屬性95涌感擁芒轍蜀風(fēng)隕贅冰轎染祁況慚猾濕鞠寧杉拎備除喪趨服矽榔條支兄秩面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-分析階段的數(shù)據(jù)類型只能是簡(jiǎn)單的、原始的數(shù)據(jù)類型,并不表示如C95在分析階段的對(duì)象模型中,不是使用屬性,而是使用關(guān)聯(lián)來(lái)聯(lián)系兩個(gè)概念的。設(shè)計(jì)中的類圖,使用外鍵實(shí)現(xiàn)對(duì)象間的聯(lián)系。CashiernamePOSTnumberUses11圖4-60不使用外部鍵的屬性CashierNamecureentPOSTNumber使用外部鍵的屬性與另一個(gè)對(duì)象發(fā)生聯(lián)系
圖4-61有外部鍵的屬性96(6)外部鍵的屬性菊藩?dú)ぴ婢d旅鋼仿輯薊句他羨敝麥騰佑嫌什暗竣駱綻似彝詭穿柑郎燃榨面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-在分析階段的對(duì)象模型中,不是使用屬性,而是使用關(guān)聯(lián)來(lái)聯(lián)系兩964.4.2關(guān)聯(lián)(Association)的設(shè)計(jì)(1)四種連接(2)增加冗余關(guān)聯(lián),提供訪問(wèn)效率(3)對(duì)限定關(guān)聯(lián)(qualifiedassociation)的考慮(4)增加關(guān)聯(lián)的導(dǎo)航(navigability)(5)對(duì)關(guān)聯(lián)類的設(shè)計(jì)97市藹嘩碳涕快鯉永津嘩僵次蟄市增爺買(mǎi)宛模檸擄埋惟蝦虞欄畢輪懇掇戀快面向?qū)ο蟮脑O(shè)計(jì)-面向?qū)ο蟮脑O(shè)計(jì)-4.4.2關(guān)聯(lián)(Association)的設(shè)計(jì)(1)97(1)四種連接全局(global):某個(gè)對(duì)象可以在全局范圍內(nèi)直接被其他對(duì)象“引用”。
參數(shù)(Parameter):某個(gè)對(duì)象作為另一個(gè)對(duì)象的某個(gè)操作
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年微機(jī)保護(hù)測(cè)控裝置項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 2024全新智能家居定制服務(wù)合同
- 2024年度租賃期滿續(xù)租合同
- 2024-2030年版中國(guó)高端禮品酒行業(yè)競(jìng)爭(zhēng)力策略及發(fā)展?jié)摿ρ芯繄?bào)告
- 2024-2030年商用飛機(jī)視頻監(jiān)控系統(tǒng)行業(yè)市場(chǎng)現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評(píng)估規(guī)劃分析研究報(bào)告
- 2024-2030年全球鋼橋行業(yè)發(fā)展態(tài)勢(shì)及投資戰(zhàn)略規(guī)劃分析報(bào)告
- 2024年文化藝術(shù)經(jīng)紀(jì)與代理合同
- 2024年文化街商鋪承包合同
- 2024-2030年全球及中國(guó)節(jié)能燈泡行業(yè)營(yíng)銷態(tài)勢(shì)及盈利前景預(yù)測(cè)報(bào)告
- 2024-2030年全球及中國(guó)百多邦軟膏行業(yè)銷售策略及競(jìng)爭(zhēng)規(guī)模預(yù)測(cè)報(bào)告
- (正式版)HGT 22820-2024 化工安全儀表系統(tǒng)工程設(shè)計(jì)規(guī)范
- 《中華民族共同體概論》考試復(fù)習(xí)題庫(kù)(含答案)
- 2022-2023學(xué)年武漢市江岸區(qū)七年級(jí)英語(yǔ)上學(xué)期期中質(zhì)量檢測(cè)卷附答案
- 第二章攪拌摩擦焊
- 內(nèi)分泌科醫(yī)師培養(yǎng)細(xì)則
- 蛋白質(zhì)與酶工程復(fù)習(xí)題 金
- 五金件通用檢驗(yàn)標(biāo)準(zhǔn)
- kummell 病ppt課件
- 小班綜合活動(dòng)《出生的秘密》
- 習(xí)題參考答案
- 綠化養(yǎng)護(hù)報(bào)價(jià)表(共8頁(yè))
評(píng)論
0/150
提交評(píng)論