(零雨其蒙原創(chuàng) 轉(zhuǎn)載請(qǐng)注明)
2007
年
3
月
13
日星期二
第
35
章
包的設(shè)計(jì)
包設(shè)計(jì)的核心就是提供穩(wěn)定的包設(shè)計(jì),減少依賴造成的影響!
組織包結(jié)構(gòu)的準(zhǔn)則
??
準(zhǔn)則
???
包在水平和垂直劃分上的功能性內(nèi)聚。
最基本的“直觀性”原則是基于功能性內(nèi)聚的模塊,將參與共同目的、服務(wù)、協(xié)作、策略和功能的強(qiáng)相關(guān)類型(類或接口)組織在一起。除此之外,還可以根據(jù)類型之間的偶合程度進(jìn)行分組。
?
?
??
準(zhǔn)則
???
由一族接口組成的包。
將一組功能上相關(guān)的接口放入單獨(dú)的包,與其實(shí)現(xiàn)類分離。
?
??
準(zhǔn)則
???
用于正式工作的包和用于聚集不穩(wěn)定類的包。
以包來(lái)發(fā)布產(chǎn)品,則將包內(nèi)穩(wěn)定的部分分成一個(gè)包(正式工作的包),包內(nèi)需要經(jīng)常修改和重新發(fā)布的部分分成一個(gè)包(用于聚集不穩(wěn)定類的包)。基本策略:減少對(duì)不穩(wěn)定包的廣泛依賴。
?
?
?
準(zhǔn)則
???
職責(zé)越多的包越需要穩(wěn)定。
職責(zé)多就意味著有許多包要依賴于此包,如果其不穩(wěn)定,就會(huì)殃及許多依賴于它的包。
?
??
準(zhǔn)則
??
將不相關(guān)的類型分離出去。
?
準(zhǔn)則
?
使用工廠模式減少對(duì)具體包的依賴。
減少對(duì)其他包中具體類的依賴是提高包的穩(wěn)定性的一個(gè)途徑。
?
準(zhǔn)則
??
包之間沒(méi)有循環(huán)依賴。
解決循環(huán)依賴有兩個(gè)方案,一個(gè)是將參與循環(huán)的類型(類或接口)分解出來(lái)形成較小的新包;另一個(gè)是使用接口來(lái)打破循環(huán),具體做法就是在一個(gè)新包中定義一個(gè)新的接口,使原來(lái)循環(huán)依賴的兩個(gè)類一個(gè)實(shí)現(xiàn)新的接口,一個(gè)依賴新的接口,
?
增強(qiáng)包的穩(wěn)定性的方法
l????????
包中僅包含或者主要包含接口和抽象類
l????????
不依賴于其他的包(這種包是獨(dú)立的),或者僅依賴非常穩(wěn)定的包,或者封裝了依賴關(guān)系以使其不受影響(比如將特定的實(shí)現(xiàn)細(xì)節(jié)隱藏在一個(gè)
fa?ade
對(duì)象之后,其他對(duì)象只對(duì)
fa?ade
對(duì)象產(chǎn)生依賴,這就是封裝依賴關(guān)系的一種方式。)。
l????????
包含相對(duì)穩(wěn)定的代碼,這些代碼在發(fā)布之前經(jīng)過(guò)充分的測(cè)試和精化。
l????????
強(qiáng)制規(guī)定具有緩慢的變化周期。
?
?
第
36
章
使用
GoF
模式完成更多對(duì)象的設(shè)計(jì)
關(guān)于異常和錯(cuò)誤處理
???
在
UML
中,異常是一個(gè)特殊的信號(hào)(
Signal
)(表示對(duì)象之間的異步通信)。這意味著,在交互圖中,異常被表示為異步消息(
P429
)。
?
?
Proxy
代理模式
代理只不過(guò)是與被代理對(duì)象實(shí)現(xiàn)相同的接口,它保存指向被代理對(duì)象的引用,并且用于控制對(duì)被代理對(duì)象的訪問(wèn)(
P431
)。
?
?
問(wèn)題:
不希望或不可能直接訪問(wèn)真正的主題對(duì)象時(shí),應(yīng)該怎么辦?
解決方案
:通過(guò)代理對(duì)象增加一層間接性,代理對(duì)象實(shí)現(xiàn)與主題對(duì)象相同的接口,并且負(fù)責(zé)控制和增強(qiáng)對(duì)主題對(duì)象的訪問(wèn)。
?
我覺(jué)得代理對(duì)象(
Proxy Object
)就是一個(gè)和被代理的對(duì)象擁有相同接口的控制器,在正常情況下,它執(zhí)行被代理對(duì)象的功能,如果失敗或其他原因,則轉(zhuǎn)向其他對(duì)象進(jìn)行處理。更通俗的理解代理就像是經(jīng)紀(jì)人,有什么事情經(jīng)紀(jì)人會(huì)替藝人出面擺平,代替藝人回答問(wèn)題,或者把問(wèn)題的焦點(diǎn)轉(zhuǎn)向別處,比如經(jīng)紀(jì)公司。
?
?
Abstract Factory
抽象工廠
問(wèn)題:
如何創(chuàng)建實(shí)現(xiàn)相同接口的一族相關(guān)的類?
解決方案
:定義一個(gè)工廠接口(抽象工廠)。為每一族要?jiǎng)?chuàng)建的事物定義一個(gè)具體工廠類。也可以定義實(shí)際的抽象類來(lái)實(shí)現(xiàn)工廠接口,并且為擴(kuò)展該抽象類的具體工廠提供公共服務(wù)。
?
剛開(kāi)始看這個(gè)話覺(jué)得真是讓人費(fèi)解,什么叫一族相關(guān)的類啊?看了例子隱約明白了,一族就是一堆,只不過(guò)這一堆有相似之處,就像是一個(gè)家族或種族的人一樣,比如
IBMJavaPOSDevicesFactory
和
NCRJavaPOSDevicesFactory
,它們是不同供應(yīng)商提供的
POS
設(shè)備
Java
驅(qū)動(dòng)程序。一個(gè)家族的人往往從事一樣的事(或許遠(yuǎn)古時(shí)代是這樣,比如一個(gè)狩獵家族或食人家族),這一族類也實(shí)現(xiàn)相同接口(意味著它們擁有相同的公共方法)。看
436
頁(yè)的類圖就可以明白這個(gè)模式是怎么回事了。
?
?
Do It Myself
模式
“
Do It Myself
”
?
?
?
我(一個(gè)軟件對(duì)象)是對(duì)實(shí)際對(duì)象的抽象,由我來(lái)完成這些通常由實(shí)際對(duì)象所完成的事情。
[Coad95]
?
其實(shí)看了這個(gè)模式讓我覺(jué)得很高興,因?yàn)樵诖酥埃彝ㄟ^(guò)自己的學(xué)習(xí)實(shí)踐和領(lǐng)悟,覺(jué)得設(shè)計(jì)對(duì)象的最基本的原則就是在現(xiàn)實(shí)生活中這個(gè)對(duì)象是什么樣的(擁有什么屬性,能干什么事),設(shè)計(jì)的軟件對(duì)象就是什么樣的,這是最自然的原則。我覺(jué)得很多設(shè)計(jì)方面的問(wèn)題都可以用最自然的方式解決,比如說(shuō)工廠模式,很自然,實(shí)際生活中的對(duì)象(鞋子,人)都是由工廠創(chuàng)造的(或是母親生的);還比如說(shuō)代理模式,如果你不能直接跟一個(gè)人打交道,自然就會(huì)尋找代理。
Larman
在這部分總是說(shuō)“
DIM
模式和多態(tài)通常盜跖相同的設(shè)計(jì)選擇”“
DIM
模式和信息專家模式通常導(dǎo)致相同的設(shè)計(jì)選擇”。
Larman
說(shuō)“這是經(jīng)典的面向?qū)ο笤O(shè)計(jì)風(fēng)格。”但他并沒(méi)有說(shuō)這是最自然最根本的設(shè)計(jì)風(fēng)格,或許在
Peter Coad
的著作中出現(xiàn)過(guò)這樣的字眼,有空再看看。不僅想到了莊子道家提倡的“大道自然”,最自然的東西就是最正確的,最合理的,最和諧的!人設(shè)計(jì)敵不過(guò)天設(shè)計(jì)(人算不如天算),現(xiàn)在人還不能設(shè)計(jì)出和自然界設(shè)計(jì)出來(lái)的人相媲美的機(jī)器人。