QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計(jì)模式(完整版)
- 首先介紹方法論,參考了《大道至簡(jiǎn) — 軟件工程實(shí)踐者的思想》
- DP與Spring、SOA類(lèi)比,皆出于實(shí)踐
- DP的必要性和要點(diǎn),輔助代碼簡(jiǎn)要說(shuō)明
- 拋磚引玉,介紹幾個(gè)DP:
- Factory Pattern
- Decorator Pattern
- Proxy Pattern
- SingLeton Pattern
- Command Pattern
- 其它
- 介紹點(diǎn):
- a) 使用一些可與現(xiàn)實(shí)結(jié)合的生動(dòng)例子(引用網(wǎng)上資源)
- 介紹其本質(zhì)(個(gè)人理解)
- 簡(jiǎn)要介紹其如何使用
<一>開(kāi)幕
大家好,我是crazycy,今天我們討論的主題是Design Pattern
首先感謝千年一嘆的安排和付出,雖然他極其的忙。
今天的話(huà)題可能不很適合初學(xué)者,對(duì)于初學(xué)者的建議可以看我的文章:http://www.aygfsteel.com/crazycy/archive/2006/07/07/57106.html
<二> 設(shè)計(jì)模式的起因
在談設(shè)計(jì)模式之前,我們想一下:為什么會(huì)有設(shè)計(jì)模式?
Christopher Alexander說(shuō):每一個(gè)模式描述了一個(gè)在我們周?chē)粩嘀貜?fù)發(fā)生的問(wèn)題以及該問(wèn)題的解決方案的核心。
咱們大多是做研發(fā)的,往往有自己的體會(huì),遇到問(wèn)題--解決問(wèn)題,這個(gè)過(guò)程中會(huì)發(fā)現(xiàn)有一些問(wèn)題及其解決方案不斷變換面孔重復(fù)出現(xiàn),其后面的有著共同的本質(zhì)。實(shí)際上這些本質(zhì)就是模式。
從哲學(xué)角度說(shuō),設(shè)計(jì)模式的出現(xiàn)是實(shí)踐經(jīng)驗(yàn)的結(jié)晶,是產(chǎn)生于實(shí)踐并指導(dǎo)實(shí)踐。
<三>聯(lián)想
說(shuō)到這里,我們現(xiàn)在用的、談的比較火爆的就是Spring Hibernate之類(lèi)的框架。是吧?
Struts直接革新了Web Model 2的應(yīng)用。
Hibernate直接解決了持久層的非面向?qū)ο蟮膶擂巍?br />
Spring直接挑戰(zhàn)了原先的Java EE框架。
這些都是源于實(shí)踐。選擇一種架構(gòu)、一種技術(shù)的依據(jù)是什么? Rod Johnson 認(rèn)為,應(yīng)該是基于實(shí)踐的依據(jù)、來(lái)自歷史項(xiàng)目或親自試驗(yàn)的經(jīng)驗(yàn),而不是任何形式的偶像崇拜或者門(mén)戶(hù)之見(jiàn)。 這個(gè)是循序方法:實(shí)踐的反復(fù)總結(jié)。(十足的哲學(xué))
為什么說(shuō)Spring是實(shí)踐的總結(jié):大家可以看一下我的blog的一片文章http://www.aygfsteel.com/crazycy/archive/2006/06/05/50519.aspx 比較簡(jiǎn)略。
<四> 哲學(xué)
周愛(ài)民先生的《大道至簡(jiǎn) — 軟件工程實(shí)踐者的思想》對(duì)方法、方法論有如下描述:
============================================================================================================
3. 方法
推動(dòng)這種邏輯向前發(fā)展的,是 “ 方法 ” 和 “ 方法論 ” 的出現(xiàn)。長(zhǎng)期的編程實(shí)踐,自然的歸演與總結(jié),必須沉淀為某種 ( 軟件開(kāi)發(fā) ) 方法,于是 “ 過(guò)程 ” 出現(xiàn)了,于是 “ 對(duì)象 ” 出現(xiàn)了,于是相關(guān)的方法論也就出現(xiàn)了。
這是實(shí)踐的成果。方法不是某個(gè)人或者某個(gè)組織創(chuàng)造的。瓜熟而蒂落,實(shí)踐積累達(dá)到一定的程度,微軟不提出某個(gè)方法, IBM 也會(huì)提出這個(gè)方法。即便他們都不提出,可能你自己已經(jīng)在使用這個(gè)方法了。
方法并不神秘,因?yàn)樗褪悄憬裉煺谧龅摹氖碌暮蛯?shí)現(xiàn)的。正如 “ 模式 ” 是一種方法,而模式就是你昨天書(shū)寫(xiě)代碼的那個(gè)行為。只不過(guò), GoF 歸納、抽取、提升了這些行為的內(nèi)在規(guī)律。
你看不到你做事的行為,也就不能理解 “ 模式 ” 作為一種方法的價(jià)值。所以大師們眾口一詞:模式需要一定的編程經(jīng)驗(yàn)才能理解。
同理,理解過(guò)程也需要編程經(jīng)驗(yàn),理解對(duì)象也需要編程經(jīng)驗(yàn),理解 MDA 與 SOA 還是需要編程經(jīng)驗(yàn)。
—— 這可能就發(fā)生在你去回顧你上一行代碼編寫(xiě)的經(jīng)過(guò),或者上一個(gè)項(xiàng)目失敗的經(jīng)歷的那一瞬息。經(jīng)驗(yàn)來(lái)源于回顧、理解與分析,而不是你將要寫(xiě)的下一行代碼。
有人在寺院掃了一輩子的落葉而得道,也有人因?yàn)橐痪湓?huà)而得道。
GoF 因?yàn)闊o(wú)數(shù)次的代碼回顧而得道。
感覺(jué)不過(guò)癮可以看一下我的blog文章:
http://www.aygfsteel.com/crazycy/archive/2006/05/24/47799.html
而對(duì)于方法論,查了一下大概闡述如下:方法論是一套完整的實(shí)踐引導(dǎo)體系,是指導(dǎo)實(shí)踐的理論基礎(chǔ),是人們?cè)陂L(zhǎng)期社會(huì)實(shí)踐中總結(jié)和摸索出來(lái)的,符合客觀發(fā)展規(guī)律的,符合人們對(duì)研究對(duì)象進(jìn)行科學(xué)分析與判斷的社會(huì)實(shí)踐進(jìn)程或步驟。方法是實(shí)踐的成果,如同瓜熟蒂落,實(shí)踐積累達(dá)到一定程度,必然會(huì)提出方法。
<五>DP產(chǎn)生的必要性和目標(biāo)
咱們大家對(duì)OO編程都熟悉,OO的三個(gè)基本特征:封裝、繼承、多態(tài)。
OO解決不了的問(wèn)題--Java為例子:
java語(yǔ)言要求將一個(gè)類(lèi)實(shí)例化時(shí),必須調(diào)用這個(gè)類(lèi)的具體類(lèi)的構(gòu)造子,所以java語(yǔ)言給出的類(lèi)的實(shí)例化方法無(wú)法做到只依賴(lài)抽象類(lèi)型。
這造成了調(diào)用者合被調(diào)用者的一種緊耦合
設(shè)計(jì)模式追求的目標(biāo)是調(diào)用者和被調(diào)用者之間的解耦。
示例:
消費(fèi)一個(gè)對(duì)象的客戶(hù)端只依賴(lài)于對(duì)象的抽象類(lèi)型,而不是具體類(lèi)型
A類(lèi):
State state = new StartState();
工廠(chǎng)類(lèi):
public class StateFactory {
public State static createState() {
State state = new. StartState();
return state;
}
}
A類(lèi):
State state = StateFactory.createState();
這樣就很容易理解工廠(chǎng)類(lèi)就是生產(chǎn)對(duì)象,也就是創(chuàng)建對(duì)象,把對(duì)象的創(chuàng)建過(guò)程從類(lèi)A中摘取出來(lái).
這樣也就達(dá)到了DP的目標(biāo),也正是因?yàn)檫@個(gè)目標(biāo)的提出,才誕生了IoC。
可以參考的我blog文章:http://www.aygfsteel.com/crazycy/archive/2006/03/19/36068.aspx
這里有朋友問(wèn)抽象工廠(chǎng)和工廠(chǎng)方法兩個(gè)模式的區(qū)別,
可以參考我的blog文章:http://www.aygfsteel.com/crazycy/archive/2006/10/08/73858.html
<六>介紹幾個(gè)模式
Decorator模式是
1. 對(duì)真實(shí)對(duì)象進(jìn)行包裝
2. 使其功能擴(kuò)展
3. 表現(xiàn)形式:new 包裝類(lèi)1(new 包裝類(lèi)2(真實(shí)對(duì)象));這樣真實(shí)對(duì)象就具備了本身、包裝類(lèi)1、包裝類(lèi)2的功能;
4. 實(shí)現(xiàn)時(shí)只需要把真實(shí)對(duì)象做為包裝類(lèi)的聚合對(duì)象;
實(shí)在不行就想想ML時(shí),如果帶上TT后,原來(lái)的不影響,而且還安全了。主要就是包裝原先的對(duì)象。
可參考我的blog文章:http://www.aygfsteel.com/crazycy/archive/2006/04/30/44169.html
Dynamic Proxy模式是
代理模式(Proxy,這里側(cè)重于Dynamic Proxy)可以理解成給一個(gè)對(duì)象提供一個(gè)代理對(duì)象,這個(gè)代理對(duì)象就是把原對(duì)象進(jìn)行包裝,使其與調(diào)用處理器相關(guān)聯(lián)。
因?yàn)榇韺?duì)象和真實(shí)對(duì)象具有相同的接口,客戶(hù)訪(fǎng)問(wèn)時(shí),通過(guò)接口調(diào)用代理實(shí)例的方法,這個(gè)調(diào)用會(huì)被分發(fā)到該實(shí)例對(duì)應(yīng)的處理器。處理器在把客戶(hù)端調(diào)用傳遞給真實(shí)的對(duì)象之前或者之后,可執(zhí)行某個(gè)操作,也可以選擇不把這個(gè)調(diào)用傳遞給真實(shí)的對(duì)象。
1. 將真實(shí)對(duì)象包裝
2. 使其與調(diào)用處理類(lèi)綁定
3. 表現(xiàn)形式:Proxy.newProxyInstance(realObject.getClass(). getClassLoader(), realObject.getClass().getInterfaces(), new InvocationHandler(realObj));這樣真實(shí)對(duì)象就與InvocationHandler類(lèi)邦定了,對(duì)外是一個(gè)代理類(lèi)的形式;
4. 實(shí)現(xiàn)時(shí)只需要把真實(shí)對(duì)象做為調(diào)用處理器的聚合對(duì)象
實(shí)在不行就想想:垂簾聽(tīng)政:猶如清朝康熙年間的四大府臣,很多權(quán)利不在皇帝手里,必須通過(guò)輔佐大臣去辦;
具體示例參加blog:
http://www.aygfsteel.com/crazycy/archive/2006/04/29/44006.html
Command模式
本質(zhì):將調(diào)用操作的對(duì)象 和 知道如何實(shí)現(xiàn)改操作的對(duì)象 解耦。
1 調(diào)用者
發(fā)出請(qǐng)求的對(duì)象,請(qǐng)求被包裝成請(qǐng)求對(duì)象的形式(側(cè)重于對(duì)象)
2 接收者
知道如何處理某個(gè)請(qǐng)求的對(duì)象。
3 關(guān)聯(lián)者
具備調(diào)用者傳入的請(qǐng)求對(duì)象;
并且綁定接收者。
大家都用過(guò)Struts吧?
或許Struts的Action就是一個(gè)很好的說(shuō)明示例:
Public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res)
方法的action就是關(guān)聯(lián)者
方法的req可以理解成請(qǐng)求者
方法的form 就是請(qǐng)求對(duì)象
方法的mapping就是接收者
posted on 2006-07-05 22:34 crazycy 閱讀(3182) 評(píng)論(7) 編輯 收藏 所屬分類(lèi): JavaEE技術(shù) 、Design Pattern、JEE Pattern