23種設計模式UML表示形式
阿新 • • 發佈:2019-02-11
一、概況:
類關係表示:
說明:
二.建立型
1.Factory Method
意圖:
定義一個用於建立物件的介面,讓子類決定例項化哪一個類。Factory Method 使一個類的例項化延遲到其子類。
適用性:
意圖: 提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
適用性:
一個系統要獨立於它的產品的建立、組合和表示時。一個系統要由多個產品系列中的一個來配置時。當你要強調一系列相關的產品物件的設計以便進行聯合使用時。當你提供一個產品類庫,而只想顯示它們的介面而不是實現時。
3.Builder
意圖:
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
適用性:
將一個類的介面轉換成客戶希望的另外一個介面。A d a p t e r 模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
適用性:
適用性:
- 當一個類不知道它所必須建立的物件的類的時候。
- 當一個類希望由它的子類來指定它所建立的物件的時候。
- 當類將建立物件的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一資訊區域性化的時候。
意圖: 提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
- 當建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時。
- 當構造過程必須允許被構造的物件有不同的表示時。
- 當要例項化的類是在執行時刻指定時,例如,通過動態裝載;或者
- 為了避免建立一個與產品類層次平行的工廠類層次時;或者
- 當一個類的例項只能有幾個不同狀態組合中的一種時。建立相應數目的原型並克隆它們可能比每次用合適的狀態手工例項化該類更方便一些。
- 當類只能有一個例項而且客戶可以從一個眾所周知的訪問點訪問它時。
- 當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改程式碼就能使用一個擴充套件的例項時。
- 你想使用一個已經存在的類,而它的介面不符合你的需求。
- 你想建立一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些介面可能不一定相容的類)協同工作。
- (僅適用於物件A d a p t e r )你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的介面。物件介面卡可以適配它的父類介面。
- 你不希望在抽象和它的實現部分之間有一個固定的繫結關係。例如這種情況可能是因為,在程式執行時刻實現部分應可以被選擇或者切換。
- 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時B r i d g e 模式使你可以對不同的抽象介面和實現部分進行組合,並分別對它們進行擴充。
- 對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的程式碼不必重新編譯。
- (C + +)你想對客戶完全隱藏抽象的實現部分。在C + +中,類的表示在類介面中是可見的。
- 有許多類要生成。這樣一種類層次結構說明你必須將一個物件分解成兩個部分。R u m b a u g h 稱這種類層次結構為“巢狀的普化”(nested generalizations )。
- 你想在多個物件間共享實現(可能使用引用計數),但同時要求客戶並不知道這一點。一個簡單的例子便是C o p l i e n 的S t r i n g 類[ C o p 9 2 ],在這個類中多個物件可以共享同一個字串表示(S t r i n g R e p )。
適用性:
- 你想表示物件的部分-整體層次結構。
- 你希望使用者忽略組合物件與單個物件的不同,使用者將統一地使用組合結構中的所有物件。
- 在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。
- 處理那些可以撤消的職責。
- 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴充套件,為支援每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於生成子類。
- 當你要為一個複雜子系統提供一個簡單介面時。子系統往往因為不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的使用者帶來一些使用上的困難。F a c a d e 可以提供一個簡單的預設檢視,這一檢視對大多數使用者來說已經足夠,而那些需要更多的可定製性的使用者可以越過f a c a d e 層。
- 客戶程式與抽象類的實現部分之間存在著很大的依賴性。引入f a c a d e 將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
- 當你需要構建一個層次結構的子系統時,使用f a c a d e 模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過f a c a d e 進行通訊,從而簡化了它們之間的依賴關係。
- 一個應用程式使用了大量的物件。
- 完全由於使用大量的物件,造成很大的儲存開銷。
- 物件的大多數狀態都可變為外部狀態。
- 如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件。
- 應用程式不依賴於物件標識。由於F l y w e i g h t 物件可以被共享,對於概念上明顯有別的物件,標識測試將返回真值。
-
在需要用比較通用和複雜的物件指標代替簡單的指標的時候,使用P r o x y 模式。下面是一 些可以使用P r o x y 模式常見情況:
1) 遠端代理(Remote Proxy )為一個物件在不同的地址空間提供區域性代表。 NEXTSTEP[Add94] 使用N X P r o x y 類實現了這一目的。Coplien[Cop92] 稱這種代理為“大使” (A m b a s s a d o r )。
2 )虛代理(Virtual Proxy )根據需要建立開銷很大的物件。在動機一節描述的I m a g e P r o x y 就是這樣一種代理的例子。
3) 保護代理(Protection Proxy )控制對原始物件的訪問。保護代理用於物件應該有不同 的訪問許可權的時候。例如,在C h o i c e s 作業系統[ C I R M 9 3 ]中K e m e l P r o x i e s 為作業系統物件提供 了訪問保護。
4 )智慧指引(Smart Reference )取代了簡單的指標,它在訪問物件時執行一些附加操作。 它的典型用途包括: - 對指向實際物件的引用計數,這樣當該物件沒有引用時,可以自動釋放它(也稱為S m a r tP o i n t e r s[ E d e 9 2 ] )。
- 當第一次引用一個持久物件時,將它裝入記憶體。
- 在訪問一個實際物件前,檢查是否已經鎖定了它,以確保其他物件不能改變它。
- 當有一個語言需要解釋執行, 並且你可將該語言中的句子表示為一個抽象語法樹時,可使用直譯器模式。而當存在以下情況時該模式效果最好:
- 該文法簡單對於複雜的文法, 文法的類層次變得龐大而無法管理。此時語法分析程式生成器這樣的工具是更好的選擇。它們無需構建抽象語法樹即可解釋表示式, 這樣可以節省空間而且還可能節省時間。
- 效率不是一個關鍵問題最高效的直譯器通常不是通過直接解釋語法分析樹實現的, 而是首先將它們轉換成另一種形式。例如,正則表示式通常被轉換成狀態機。但即使在這種情況下, 轉換器仍可用直譯器模式實現, 該模式仍是有用的。
- 有多個的物件可以處理一個請求,哪個物件處理該請求執行時刻自動確定。
- 你想在不明確指定接收者的情況下,向多個物件中的一個提交一個請求。
- 可處理一個請求的物件集合應被動態指定。
- 訪問一個聚合物件的內容而無需暴露它的內部表示。
- 支援對聚合物件的多種遍歷。
- 為遍歷不同的聚合結構提供一個統一的介面(即, 支援多型迭代)。
- 一組物件以定義良好但是複雜的方式進行通訊。產生的相互依賴關係結構混亂且難以理解。
- 一個物件引用其他很多物件並且直接與這些物件通訊,導致難以複用該物件。
- 想定製一個分佈在多個類中的行為,而又不想生成太多的子類。
- 一個物件的行為取決於它的狀態, 並且它必須在執行時刻根據狀態改變它的行為。
- 一個操作中含有龐大的多分支的條件語句,且這些分支依賴於該物件的狀態。這個狀態通常用一個或多個列舉常量表示。通常, 有多個操作包含這一相同的條件結構。S t a t e模式將每一個條件分支放入一個獨立的類中。這使得你可以根據物件自身的情況將物件的狀態作為一個物件,這一物件可以不依賴於其他物件而獨立變化。
- 許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。
- 需要使用一個演算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的演算法。當這些變體實現為一個演算法的類層次時[HO87] ,可以使用策略模式。
- 演算法使用客戶不應該知道的資料。可使用策略模式以避免暴露覆雜的、與演算法相關的資料結構。
- 一個類定義了多種行為, 並且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。
-
-
-
意圖:
表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
適用性:
- 一個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。
- 需要對一個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作“汙染”這些物件的類。Vi s i t o r 使得你可以將相關的操作集中起來定義在一個類中。當該物件結構被很多應用共享時,用Vi s i t o r 模式讓每個應用僅包含需要用到的操作。
- 定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好。
-
意圖:
表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
適用性:
-