讀書筆記 大話設計模式 其三

2022-09-08 07:36:07 字數 4376 閱讀 1594

備忘錄模式

定義在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外保持這個狀態。這樣以後就可將該物件恢復到原先保持的狀態

把要儲存的細節給封裝在了memento中了,哪一天要更改保持的細節也不用影響客戶端了

比較適用於功能比較複雜的,但需要維護或記錄屬性歷史的類;或需要儲存的屬性只是眾多屬性中的一小部分時,originator可以根據儲存的memento資訊還原到前一狀態

如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那麼命令模式可以使用備忘錄模式來儲存可撤銷操作的狀態

使用備忘錄可以把複雜的物件內部資訊對其它的物件遮蔽起來

當角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時儲存起來的備忘錄將狀態復原

組合模式

定義將物件組合成樹形結構以表示『部分-整體』的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性

透明方式與安全方式

透明方式 在component中宣告所有用來管理子物件的方法,其中報考add、remove等。這樣實現component介面的所有子類都具備了add和remove。這樣做的好處就是葉節點和枝節點對於外界沒有區別,它們具備完全一致的行為介面。但問題也明顯,因為leaf類本身不具備add()、remove()方法的功能,所以實現它是沒有意義的

安全模式 在component介面中不去宣告add和remove方法,那麼子類的leaf也就不需要去實現它,而是在composite宣告所有用來管理子類物件的方法,不過由於不夠透明,所以樹葉和樹枝類將不具有相同的介面,客戶端呼叫需要做相應的判斷,帶來了不方便

何時使用

需求中是體現部分與整體層次的結構時,希望使用者可以忽略組合物件與單個物件的不同,統一地使用組合結構中的所有物件時,就應該考慮用組合模式

好處組合模式定義了包含基本物件和組合物件的類層次結構。基本物件可以被組合成更複雜的組合物件,而這個組合物件又可以被組合,這樣不斷地遞迴下去,客戶**中,任何用到基本物件的地方都可以使用組合物件了

使用者是不用關心到底是處理乙個葉節點還是處理乙個組合元件,也就用不著為定義組合而寫一些選擇判斷語句了

讓客戶可以一致地使用組合結構和單一物件

迭代器模式

提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示

需要訪問乙個聚集物件,而且不管這些物件是什麼都需要遍歷的時候,你就應該考慮用迭代器模式

需要對聚集有多種方法遍歷時,可以考慮用迭代器模式

為遍歷不同的聚集結構提供如開始、下乙個、是否結束、當前哪一項等統一的介面

分離了集合物件的遍歷行為,抽象出乙個迭代器來負責,這樣可以做到不暴露集合的內部表示,又可以讓外部**透明地訪問集合內部的資料

單例模式

定義保證乙個類僅有乙個例項, 並提供乙個訪問它的全域性訪問點

通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的辦法就是,讓類自身負責保持它的唯一例項。這個類可以保證沒有其它例項可以被建立,並且它可以提供乙個訪問該例項的方法

單例模式因為singleton類封裝它的唯一例項,這樣它可以嚴格地控制客戶怎樣訪問以及何時訪問它。簡單地說就是對唯一例項的受控訪問

餓漢式單例類:靜態初始化 在自己被載入時就將自己例項化

懶漢式單例類:靜態初始化 在第一次被引用時,才會將自己例項化

雙重鎖定

橋接模式

合成/聚合復用原則

盡量使用合成/聚合,盡量不要使用類繼承

好處是 優先使用物件的合成/聚合將有助於你保持每個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,並且不太可能增長為不可控制的龐然大物

定義將抽象部分與它的實現部分分離,使它們都可以獨立地變化

實現指的是抽象類和它的派生類用來實現自己的物件

實現系統可能有多角度分類,每一種分類都有可能變化,那麼就把這種多角度分離出來讓它們獨立變化,減少它們之間的耦合

只要真正深入地理解了設計原則,很多設計模式其實就是原則的應用而已,或許在不知不覺中就在使用設計模式了

命令模式

定義將乙個請求封裝為乙個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作

作用第一 能較容易地設計乙個命令佇列

第二 在需要的情況下,可以較容易地將命令記入日誌

第三 允許接收請求的一方決定是否要否決請求

第四 可以容易地實現對請求的撤銷和重做

第五 由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易

敏捷開發原則告訴我們們不要為**新增基於猜測的、實際不需要的功能。如果不清楚乙個系統是否需要命令模式,一般就不要著急去實現它,事實上,在需要的時候通過重構實現這個模式並不困難,只有在真正需要如撤銷/恢復操作等功能時,把原來的**重構為命令模式才有意義

職責鏈模式

定義使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止

好處當客戶提交乙個請求時,請求是沿著鏈傳遞直至有乙個concretehandle物件負責處理它

接收者和傳送者都沒有對方的明確資訊,且鏈中的物件自己也並不知道鏈的結構。結果是職責鏈可簡化物件的相互連線,它們僅需保持乙個指向其後繼者的引用,而不需保持它所有的候選接收者的引用

隨時地增加或修改處理乙個請求的結構。增強了給物件指派職責的靈活性

乙個請求極有可能到了鏈的末端都得不到處理,或者因為沒有正確配置而得不到處理

中介者模式

儘管將乙個系統分割成許多物件通常可以增加其復用性,但是物件間的相互連線的激增又會降低其可復用性

大量的連線使得乙個物件不可能在沒有其他物件的支援下工作,系統表現為乙個不可分割的整體,所有,對系統的行為進行任何較大的改動就十分困難了

定義用乙個中介物件來封裝一系列的物件互動。中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動

優缺點一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合,以及想定製乙個分布在多個類中的行為,而又不想生成太多的子類的場合

當系統出現了『多對多』互動複雜的物件群時,不要急於使用中介者模式,而要先反思你的系統在設計上是不是合理

優先 mediator的出現減少了各個colleague的耦合,使得可以獨立地改變和復用各個colleague類和mediator。由於把物件如何協作進行了抽象,將中介作為乙個獨立的概念年並將其封裝在乙個物件中,這樣關注的物件就從物件各自本身的行為轉移到它們之間的互動上來,也就是站在乙個更巨集偉的角度去看待系統

由於concretemediator控制了集中化,於是就把互動複雜性變為了中介者的複雜性,這就是使得中介者會變得比任何乙個concretecolleague都複雜

享元模式

定義運用共享技術有效地支援大量細粒度的物件

內部狀態與外部狀態

內部狀態:享元物件內部並且不會隨著環境改變而改變的共享部分,concretefluweight

外部狀態:隨環境改變而改變的、不可以共享的狀態

享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來顯示資料。如果能發現這些例項除了幾個引數外基本都是相同的,有時就能夠受大幅度地減少需要例項化的類的數量。如果能把那些引數移到類例項的外面,在方法呼叫時將它們傳遞進來,就可以通過共享大幅度地減少單個例項的數量

應用如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用;還有就是物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時可以考慮使用享元模式

直譯器模式

給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來接收語言中的句子

要解決的是,如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題

好處:當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹時,可使用直譯器模式

容易地改變和擴充套件文法,因為該模式使用類來表示文法規則,你可使用繼承來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹中各個節點的類的實現大體類似,這些都易於直接編寫

不足:為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理和維護。建議當文法非常複雜時,使用其他的技術如語法分析程式或編譯器生成器來處理

訪問者模式

定義表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作

適用於資料結構相對穩定的系統。它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化

目的是要把處理從資料結構分離出來。如果系統有比較穩定的資料結構,又有易於變化的演算法的話,使用訪問者模式就是比較適合的,因為訪問者模式使得演算法操作的增加變得容易

優點是 增加新的操作很容易,因為增加新的操作就意味著增加乙個新的訪問者。訪問者模式將有關的行為集中到乙個訪問者物件中

缺點是 使增加新的資料結構變得困難了

讀書筆記 大話設計模式

大話設計模式 的確寫的很不錯。把晦澀解懂的設計模式,講的通俗易懂。邊讀邊用evernote做筆記,把印象深刻的整理了一下。先補習一下uml的圖示法 繼承,介面,組合,依賴,關聯 策略模式 strategy 定義一系列演算法,所有演算法完成的都是相同的工作,只是實現不同。減少演算法與使用類之間的藕合。...

大話設計模式讀書筆記一

1矩形框代表乙個類。如果類是抽象的,那麼要用斜體表示。第二層是字段和屬性。第三次是類的方法和行為。對應的屬性表示為 notation meaning public private protected 乙個例子就是 如果定義乙個介面。要在名稱上面加 介面也用棒棒糖語法表示 下面將類與類之間的關係。知道...

讀書筆記 大話設計模式(上)

最近翻了大話設計模式,裡面的 很多,很值得細細品味,值得借鑑,可惜時間不太夠,就草草記錄了下一些重要的點,還有半本的下個月再寫。工廠模式 策略模式 單一職責。拍照就是拍照,單獨出來比較好。開放 封閉原則。對程式的改動是通過增加新 進行的,而不是更改現有的 一國兩制,考研找工作兩不誤。依賴倒轉原則。提...