2010年11月27日 星期六

Design pattern學習心得筆記(未完待續)

軟工上了一學期的課,每人輪流報了23個Design Pattern,但還是模糊不清,當然最終還是覺得靠自己最實在,以下是看了良葛格的Design Pattern後,所整理的最最重點,雖然他寫得不錯,但總覺得內文有些是翻譯過來的,非常不順...但還是感謝他!!

良葛格的Design Pattern連結

看了前三個Factory系列,抓到了一個Factory的重點,那就是Logic Hiding,怎麼說呢,其實聽到大部份人回應Design Pattern都會說,UML圖有看沒有懂,那是因為太強求我該如何用它才會這樣,其實我的想法是有fu就好了~~

Design Pattern具有三個大方向,分別是Creational Patterns, Structural Patterns 與 Behavioral Patterns 三種。

 

下面是關於第一種 Creational Patterns,也就是專門用來創造的,說白一點,就是在java裡的xxx x = new xxx()的new xxx() ==> 總之就是建立物件時候用的啦@@。

====================

  • Factory呢,我認為只要它出現,就會有敘述,factory.getXXXX(),或是xx.xxx(factory);。然後abstract factory是指在class這個觀點,而factory method只是一個class中,其中一個未實作的method罷了。其實主要的目的是將"確定要用的型別"定義在factory裡面,而這些型別一律採用interface的繼承方式(無論哪種語言啦,都是指最上層那個代表概念的介面就是了);所以當把型別繼承interface並且實作完成以後,就到factory內修改成(加入)這個型別...結束。
  • Builder有點麻煩,我自己也沒看得懂,反正就是和abstract factory差不多,不過他會與其它必須的"型別相依",如果有強者看見我的拙著,會的請用更簡單的話教教眾生吧,感謝...。
  • prototype就直接想成我們平常不是都用new xxx()嗎,但是這個new 的成本太大了(配置記憶體、加入當時環境並運算...反正就new一次要花很多時候在cpu上),這時候呢,我們就把原有已經new好的相同型別的,直接clone一個出來(也就是xxx的記憶體直接1對1複製,不用再算有的沒的),夠簡單吧。
  • singleton說明白點就是只準給你一個物件(實體),你再怎麼new xxx(),它回傳的指標都是一模一樣,酷吧,這個簡單到我偷笑了。

 

很快的就進入第二種 Structural Mode...

====================

  • Adapter就是把你要的項目包起來,以更通用的介面、或是更快捷更少量的實作達到更簡單使用的目的,所以UML圖裡面,才會使用一個target的介面,然後一個實作這個target介面的adapter包住你要用的項目adaptee。
  • bridge模式的重點在於將程式邏輯,和表現部份(ex: I/O)抽離,因為表示部份可能因為不同的版本而改變,但程式邏輯並不和這相關,當版本改變時又得重寫那不就哭哭了嗎,所以先做一個表現層次,接著在邏輯層次呼叫這些通用的表現介面,假設表示類別需要做修正,只需新增實作的表現介面即可。
  • composite的意思就是一個容器能儲存很多單一的個體,但是這個容器與個體的型別都必須實作一介面的方法,容器可用此方法作用於容器內的這群個體,而個體也能用此方法對自己作用,因此composite的關鍵在容器儲存的型別是介面型別,但事實上是儲存個體的型別實體,看起來很像是複合的。
  • decorator意指一的個能當作一個層次,然後新的功能就繼承上一代,說實在的這與傳統的想法沒有不同,就是一件事情一個層別負責,但它較具特色的部份是利用上一層級產出的資料加工,另一個重點是一般繼承不會將上一個介面放入自己的成員中。decoretor與composite很容易搞混,差別在於composite能讓物件具有獨立性或複合性,而decorator能在維持原有介面下依然能延展新的能力。
  • Facade提供更高層級的介面,它將複雜的實作藏起來,只提供更簡易的內容,簡單的說,就是再架一層更簡單的介面,然後此介面中再實作較多細節的內容。
  • Flyweight很簡單,只是將可以共同的物件,能不重覆,就不重覆的方式,我是覺得它比較不在乎速度,比較在乎容量~~畢竟做出一個新物件,就算拿去比較最快也得要O(1),但它的容量卻省很多~~
  • Proxy就是代理的意思,若是a物件的代理,則若要用到a時,請找proxya,proxya一定能傳達訊息給a,但是之中會做點事情,這個事情端看使用者如何定義,因此重點是proxy想代理的功能才是重點。

 

很快的就進入第三種 Behavior Mode...

====================

  • Chain of Responsibility就是將一連串的判斷行為拆成像鏈子的一串class,每個class都處理不同情況要反應的事,所以不用因為加一個或減一個,而動到很多結構。
  • Command的意義在於物件的加入和執行抽離,可以動態加入動作,再選擇執行的內容,不需要改很大。
  • Strategy的用意是在獨立不同的演算流程(演算法),來源是一樣的,它的流程是不同的,但演算流程之間是相似的,它與Command很像,但我自已的感覺是Command是依對象的不同,回應不同的請求,但是Strategy則是同樣的請求,但最後的處理與回應相似,只有中間的流程是不同的。
  • Template很像是限定好介面,然後等得之後實作它的內容,但它強調部份方法是實作時再進行,而一些已經預定的流程會先實作好,這樣就是在製作一個樣板的動作,好讓之後的人有個模型可以跟隨。
  • Observer在於建立物件集合發生變化時的反應,簡單的說可以視為訂閱者,能監看物件集合的內容,有何種變化該進行怎樣的通知等等。
  • Mediator能視為居中協調的角色,所有獨立物件之間不應該知道有其它人的產生,每人只需對Mediator負責即可,然後Mediator再視情況改變每一個人的狀態即可。
  • State是將原來相依性很強的結構邏輯拆開,讓State的子類別實體去決定該將旗號交給誰,而不是一個單一的個體控制全部,但怎麼變都是讓狀態設定為其中State一個子類別的實體罷了。

沒有留言:

張貼留言