cuiyi's blog(崔毅 crazycy)

          記錄點滴 鑒往事之得失 以資于發(fā)展
          數(shù)據(jù)加載中……

          QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計模式(完整版)

          1. 首先介紹方法論,參考了《大道至簡 — 軟件工程實踐者的思想》
          2. DP與Spring、SOA類比,皆出于實踐
          3. DP的必要性和要點,輔助代碼簡要說明
          4. 拋磚引玉,介紹幾個DP:
              •   Factory Pattern
              • Decorator Pattern
              •  Proxy Pattern
              • SingLeton Pattern
              • Command Pattern
              • 其它
            • 介紹點:
              • a) 使用一些可與現(xiàn)實結(jié)合的生動例子(引用網(wǎng)上資源)
              • 介紹其本質(zhì)(個人理解)
              • 簡要介紹其如何使用


                             <一>開幕

          大家好,我是crazycy,今天我們討論的主題是Design Pattern

          首先感謝千年一嘆的安排和付出,雖然他極其的忙。

          今天的話題可能不很適合初學(xué)者,對于初學(xué)者的建議可以看我的文章:http://www.aygfsteel.com/crazycy/archive/2006/07/07/57106.html


                           <二> 設(shè)計模式的起因

          在談設(shè)計模式之前,我們想一下:為什么會有設(shè)計模式?

          Christopher Alexander說:每一個模式描述了一個在我們周圍不斷重復(fù)發(fā)生的問題以及該問題的解決方案的核心。

          咱們大多是做研發(fā)的,往往有自己的體會,遇到問題--解決問題,這個過程中會發(fā)現(xiàn)有一些問題及其解決方案不斷變換面孔重復(fù)出現(xiàn),其后面的有著共同的本質(zhì)。實際上這些本質(zhì)就是模式。

          從哲學(xué)角度說,設(shè)計模式的出現(xiàn)是實踐經(jīng)驗的結(jié)晶,是產(chǎn)生于實踐并指導(dǎo)實踐。


                           <三>聯(lián)想

          說到這里,我們現(xiàn)在用的、談的比較火爆的就是Spring Hibernate之類的框架。是吧?

          Struts直接革新了Web Model 2的應(yīng)用。
          Hibernate直接解決了持久層的非面向?qū)ο蟮膶擂巍?br /> Spring直接挑戰(zhàn)了原先的Java EE框架。

          這些都是源于實踐。選擇一種架構(gòu)、一種技術(shù)的依據(jù)是什么? Rod Johnson 認(rèn)為,應(yīng)該是基于實踐的依據(jù)、來自歷史項目或親自試驗的經(jīng)驗,而不是任何形式的偶像崇拜或者門戶之見。 這個是循序方法:實踐的反復(fù)總結(jié)。(十足的哲學(xué))

          為什么說Spring是實踐的總結(jié):大家可以看一下我的blog的一片文章http://www.aygfsteel.com/crazycy/archive/2006/06/05/50519.aspx  比較簡略。


                          <四> 哲學(xué)

          周愛民先生的《大道至簡 — 軟件工程實踐者的思想》對方法、方法論有如下描述:
          ============================================================================================================
          3. 方法

          推動這種邏輯向前發(fā)展的,是 方法 方法論 的出現(xiàn)。長期的編程實踐,自然的歸演與總結(jié),必須沉淀為某種 ( 軟件開發(fā) ) 方法,于是 過程 出現(xiàn)了,于是 對象 出現(xiàn)了,于是相關(guān)的方法論也就出現(xiàn)了。

          這是實踐的成果。方法不是某個人或者某個組織創(chuàng)造的。瓜熟而蒂落,實踐積累達到一定的程度,微軟不提出某個方法, IBM 也會提出這個方法。即便他們都不提出,可能你自己已經(jīng)在使用這個方法了。

          方法并不神秘,因為它就是你今天正在做的、從事的和實現(xiàn)的。正如 模式 是一種方法,而模式就是你昨天書寫代碼的那個行為。只不過, GoF 歸納、抽取、提升了這些行為的內(nèi)在規(guī)律。

          你看不到你做事的行為,也就不能理解 模式 作為一種方法的價值。所以大師們眾口一詞:模式需要一定的編程經(jīng)驗才能理解。

          同理,理解過程也需要編程經(jīng)驗,理解對象也需要編程經(jīng)驗,理解 MDA SOA 還是需要編程經(jīng)驗。

          —— 這可能就發(fā)生在你去回顧你上一行代碼編寫的經(jīng)過,或者上一個項目失敗的經(jīng)歷的那一瞬息。經(jīng)驗來源于回顧、理解與分析,而不是你將要寫的下一行代碼。

          有人在寺院掃了一輩子的落葉而得道,也有人因為一句話而得道。

          GoF 因為無數(shù)次的代碼回顧而得道。

          感覺不過癮可以看一下我的blog文章:
          http://www.aygfsteel.com/crazycy/archive/2006/05/24/47799.html

          而對于方法論,查了一下大概闡述如下:方法論是一套完整的實踐引導(dǎo)體系,是指導(dǎo)實踐的理論基礎(chǔ),是人們在長期社會實踐中總結(jié)和摸索出來的,符合客觀發(fā)展規(guī)律的,符合人們對研究對象進行科學(xué)分析與判斷的社會實踐進程或步驟。方法是實踐的成果,如同瓜熟蒂落,實踐積累達到一定程度,必然會提出方法。

                       
                      <五>DP產(chǎn)生的必要性和目標(biāo)

          咱們大家對OO編程都熟悉,OO的三個基本特征:封裝、繼承、多態(tài)。

          OO解決不了的問題--Java為例子:
          java語言要求將一個類實例化時,必須調(diào)用這個類的具體類的構(gòu)造子,所以java語言給出的類的實例化方法無法做到只依賴抽象類型。
          這造成了調(diào)用者合被調(diào)用者的一種緊耦合

          設(shè)計模式追求的目標(biāo)是調(diào)用者和被調(diào)用者之間的解耦。

          示例:
          消費一個對象的客戶端只依賴于對象的抽象類型,而不是具體類型

          A類:
          State state = new StartState();
          工廠類:
          public class StateFactory {
          public State static createState() {
                State state  =  new. StartState();
                  return state;
              } 
          }
          A類:
          State state = StateFactory.createState();
          這樣就很容易理解工廠類就是生產(chǎn)對象,也就是創(chuàng)建對象,把對象的創(chuàng)建過程從類A中摘取出來.

          這樣也就達到了DP的目標(biāo),也正是因為這個目標(biāo)的提出,才誕生了IoC。
          可以參考的我blog文章:http://www.aygfsteel.com/crazycy/archive/2006/03/19/36068.aspx


          這里有朋友問抽象工廠和工廠方法兩個模式的區(qū)別,
          可以參考我的blog文章:http://www.aygfsteel.com/crazycy/archive/2006/10/08/73858.html


                              <六>介紹幾個模式
          Decorator模式是
          1. 對真實對象進行包裝
          2. 使其功能擴展
          3. 表現(xiàn)形式:new 包裝類1(new 包裝類2(真實對象));這樣真實對象就具備了本身、包裝類1、包裝類2的功能;
          4. 實現(xiàn)時只需要把真實對象做為包裝類的聚合對象;
          實在不行就想想ML時,如果帶上TT后,原來的不影響,而且還安全了。主要就是包裝原先的對象。

          可參考我的blog文章:http://www.aygfsteel.com/crazycy/archive/2006/04/30/44169.html



          Dynamic Proxy模式是
          代理模式(Proxy,這里側(cè)重于Dynamic Proxy)可以理解成給一個對象提供一個代理對象,這個代理對象就是把原對象進行包裝,使其與調(diào)用處理器相關(guān)聯(lián)。
          因為代理對象和真實對象具有相同的接口,客戶訪問時,通過接口調(diào)用代理實例的方法,這個調(diào)用會被分發(fā)到該實例對應(yīng)的處理器。處理器在把客戶端調(diào)用傳遞給真實的對象之前或者之后,可執(zhí)行某個操作,也可以選擇不把這個調(diào)用傳遞給真實的對象。
          1. 將真實對象包裝
          2. 使其與調(diào)用處理類綁定
          3. 表現(xiàn)形式:Proxy.newProxyInstance(realObject.getClass(). getClassLoader(), realObject.getClass().getInterfaces(), new InvocationHandler(realObj));這樣真實對象就與InvocationHandler類邦定了,對外是一個代理類的形式;
          4. 實現(xiàn)時只需要把真實對象做為調(diào)用處理器的聚合對象
          實在不行就想想:垂簾聽政:猶如清朝康熙年間的四大府臣,很多權(quán)利不在皇帝手里,必須通過輔佐大臣去辦;
          具體示例參加blog:
          http://www.aygfsteel.com/crazycy/archive/2006/04/29/44006.html


          Command模式
          本質(zhì):將調(diào)用操作的對象 和 知道如何實現(xiàn)改操作的對象 解耦。
          1 調(diào)用者
           發(fā)出請求的對象,請求被包裝成請求對象的形式(側(cè)重于對象)
          2 接收者
           知道如何處理某個請求的對象。
          3 關(guān)聯(lián)者
           具備調(diào)用者傳入的請求對象;
             并且綁定接收者。

          大家都用過Struts吧?
          或許Struts的Action就是一個很好的說明示例:
           Public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res)
          方法的action就是關(guān)聯(lián)者
          方法的req可以理解成請求者
          方法的form 就是請求對象
          方法的mapping就是接收者

           

          posted on 2006-07-05 22:34 crazycy 閱讀(3180) 評論(7)  編輯  收藏 所屬分類: JavaEE技術(shù)Design Pattern、JEE Pattern

          評論

          # re: QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計模式(完整版)  回復(fù)  更多評論   

          還是Struts? 有沒有WEBWORK呢
          2006-07-08 09:03 | 醉天涯

          # re: QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計模式(完整版)  回復(fù)  更多評論   

          @醉天涯
          WEBWORK 沒有接觸過 怕誤導(dǎo)....
          2006-07-08 09:55 | crazycy

          # re: QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計模式(完整版)  回復(fù)  更多評論   

          挺不錯的討論,如何加這個群
          2006-07-12 15:05 | pesome

          # re: QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計模式(完整版)  回復(fù)  更多評論   

          群號:14506793
          2006-07-12 19:17 | crazycy

          # re: QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計模式(完整版)  回復(fù)  更多評論   

          為什么不能加入那個QQ群呢?
          2006-07-24 13:50 | NightFlyig

          # re: QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計模式(完整版)  回復(fù)  更多評論   

          同問,我也加不了,555
          2006-07-30 18:17 | dyerac in java...

          # re: QQ群:Java技術(shù)聯(lián)盟 第三次技術(shù)討論之設(shè)計模式(完整版)  回復(fù)  更多評論   

          你的工廠模式多了個點!:)
          2006-12-31 00:21 | 123
          主站蜘蛛池模板: 湖北省| 桦甸市| 绥芬河市| 买车| 五指山市| 邻水| 调兵山市| 台南市| 汝阳县| 嘉义县| 苍山县| 淳化县| 九龙城区| 扎鲁特旗| 分宜县| 昆山市| 双辽市| 新巴尔虎右旗| 曲麻莱县| 吴忠市| 大姚县| 武夷山市| 鄂尔多斯市| 巴彦淖尔市| 鹿泉市| 平定县| 辛集市| 佛冈县| 万安县| 黔南| 巨野县| 新营市| 睢宁县| 施甸县| 出国| 丹阳市| 驻马店市| 玉林市| 综艺| 凤阳县| 汉寿县|