《Head First設(shè)計模式》讀書筆記 - 1

          Posted on 2008-04-13 15:01 applupus 閱讀(1494) 評論(0)  編輯  收藏 所屬分類: 設(shè)計模式
          設(shè)計原則1
          找出應(yīng)用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起。

          不管當(dāng)初軟件設(shè)計得多好,一段時間后,總是需要成長與改變,否則軟件會死亡。

          設(shè)計原則2
          針對接口編程,而不是針對實現(xiàn)編程。

          其真正意思是針對超類編程,不一定非要用接口,關(guān)鍵在多態(tài)。這樣程序在執(zhí)行時會根據(jù)實際狀況執(zhí)行到真正的行為,不會被綁死在超類型的的行為上。

          更明確地說,是變量的聲明類型應(yīng)該是超類型,通常是一個抽象類或者是一個接口,如此,只要是具體實現(xiàn)此超類型的類所產(chǎn)生的對象,都可以指定給這個變量。

          設(shè)計原則3
          多用組合,少用繼承。

          組合建立的系統(tǒng)具有更大的彈性,不僅可以將算法封裝成類,更可以在運行時動態(tài)地改變行為。

          1、策略模式(Strategy)
          定義了算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨立于使用算法的客戶。

          使用模式談?wù)撥浖到y(tǒng),可以讓你保持在設(shè)計層次,不會被壓低到對象與類這種瑣碎的事情上面。

          建立可維護的OO系統(tǒng),要訣就在于隨時想到系統(tǒng)以后可能需要變化以及如何應(yīng)付變化的原則。

          2、觀察者模式(Observer)
          定義了對象之間的一對多依賴,這樣一來,當(dāng)一個對象改變狀態(tài)時,它的所有依賴者都會收到通知并自動更新。有push和pull兩種模式。

          典型:Swing中的Listener。

          設(shè)計原則4
          為了交互對象之間的松耦合設(shè)計而努力。

          關(guān)于java內(nèi)置的觀察者模式支持。
          Observable是一個類而不是接口,java不支持多繼承,限制了Observable的復(fù)用潛力,無法建立自己的實現(xiàn)。
          它將關(guān)鍵的方法protected起來,這樣除非繼承自O(shè)bservable,否則無法創(chuàng)建Observable實例并組合到自己的對象中來。
          所以除非Observable符合你的要求,否則自己實現(xiàn)一套觀察者模式。
          setChanged()方法把changed標志設(shè)為true,notifyObservers()只會在changed標為true時才會通知觀察者。

          不要依賴于觀察者被通知的順序。

          設(shè)計原則5-開放關(guān)閉原則
          類應(yīng)該對擴展開放,對修改關(guān)閉。
          ---代碼應(yīng)該如同晚霞中的蓮花一樣地關(guān)閉(免于改變),如同晨曦中的蓮花一樣地開放(能夠擴展)。

          讓設(shè)計的每個部分都遵循開放-關(guān)閉原則,通常是辦不到的。即使做到了也會耗費大量的時間和精力,遵循開放關(guān)閉原則通常會引入新的抽象層次,增加代碼的復(fù)雜度。你需要把注意力集中在設(shè)計中最有可能改變的地方,然后應(yīng)用開放-關(guān)閉原則。
          這需要多看例子積累經(jīng)驗。


          3.裝飾者模式(Decorator)
          動態(tài)地將責(zé)任附加到對象上。若需要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。符合開閉原則!

          裝飾者與被裝飾對象擁有相同的超類型。
          可以用一個或者多個裝飾者包裝一個對象。
          在任何需要被包裝對象的場合,都可以用裝飾過它的對象代替它。
          裝飾者可以在被裝飾者的行為之前/之后,加上自己的行為,以達到特定的目的。
          對象可以在任何時候被裝飾,所以可以在運行時動態(tài)地、不限量地用你喜歡的裝飾者來裝飾對象。

          典型:java i/o 。FilterInputStream就是一個裝飾者類。

          “缺點”:利用裝飾者模式常常造成設(shè)計中有大量的小類,數(shù)量實在太多了,可能造成使用此API程序員的困擾。但是,當(dāng)了解到裝飾者的工作原理,以后使用別人大量裝飾的API時,就可以很容易地辨別出它們的裝飾者類是如何組織的,以方便包裝方式取得想要的行為。

          初次接觸java i/o類庫,往往無法輕易理解它。但是一旦認識到這些類都是用來包裝InputStream的,一切都變得簡單多了。


          4.工廠模式(Simple Factory)

          把new操作符替換成工廠對象的創(chuàng)建方法,不再具體實例化。

          把產(chǎn)生對象的代碼分離出來,這樣其余的代碼沒有和具體的對象打交道,就可以對修改關(guān)閉了。而獨立出來生產(chǎn)對象的工廠可以為很多的類服務(wù)!不僅僅是剛才那個。

          工廠方法用來處理對象的創(chuàng)建,并將這樣的行為封裝在子類中。這樣,客戶程序中關(guān)于超類的代碼就和子類對象創(chuàng)建代碼解耦了。



          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 长海县| 青神县| 固阳县| 佛坪县| 边坝县| 南澳县| 彰化市| 永兴县| 康定县| 图木舒克市| 灌南县| 抚州市| 安福县| 平远县| 禄丰县| 西林县| 开江县| 漯河市| 乌拉特中旗| 萨迦县| 枝江市| 东丰县| 库伦旗| 杂多县| 格尔木市| 蓬溪县| 根河市| 乡城县| 开原市| 惠水县| 太谷县| 梁平县| 文化| 屏山县| 怀来县| 邳州市| 泰顺县| 板桥市| 邯郸市| 普兰店市| 丽水市|