文章目錄
- 前言
- 代理模式(Proxy)
- 擴充卡模式(Adapter)
- 外觀模式(Facade)
- 裝飾模式(Decorator)
- 組合模式(Composite)
- 橋接模式(Bridge)
- 享元模式(Flyweight)
- 記憶
- 參考資料
- 總結
- 作者的話
前言
結構型設計模式總結。
代理模式(Proxy)
描述:
- 為其他對象提供一種代理以控制對這個對象的通路
結構:
- 抽象服務類
- 具體服務類——與抽象服務類是繼承關系——被代理者
- 代理類——與抽象服務類是繼承關系,與具體服務類是關聯關系——代理者
關聯關系和聚合關系的差別:
- 語義不同,實作相同
- 關聯關系:對象間是平等的,側重了解。如企鵝了解氣候
- 聚合關系:對象間是不平等的,側重包含。如雁群包含大雁
- 該系列部落格對關聯關系和聚合關系,語義上盡量用對詞,實作上不再區分用詞
概述:
- 抽象服務類:抽象方法
- 具體服務類:重寫抽象服務類的抽象方法為具體方法
- 代理類:具體服務類對象——代理
- 代理類:重寫抽象服務類的抽象方法為具體方法——代理
- 具體方法:具體服務類對象調用具體服務類的具體方法——代理過程
- 用戶端:建立代理類對象(可能需要建立具體服務類對象——顯式指明被代理對象),代理類對象調用代理類的具體方法
核心:
- 繼承
- 多态
- 具體服務類——被代理者
- 代理類——代理者
- 代理類繼承與具體服務類相同的抽象服務類——僞裝成具體服務類
- 代理類對象調用代理類方法,實際上是具體服務類對象調用具體服務類方法——代理過程
- 用戶端可以隻知道代理類,不知道具體服務類
擴充卡模式(Adapter)
别名:
- 封裝器模式(Wrapper)
描述:
- 将一個類的接口轉換成客戶希望的另外一個接口。使得原本由于接口不相容而不能一起工作的那些類可以一起工作
類型:
- 類擴充卡模式:使用多繼承機制: 擴充卡繼承兩個類。 隻能在支援多繼承的程式設計語言中實作, 如 C++
- 對象擴充卡模式:使用構成原則: 擴充卡繼承一個類, 封裝另一個類對象。 所有流行的程式設計語言都可以實作
類擴充卡模式:
結構:
- 目标類——用戶端能夠使用的接口——适配者
- 需适配類——客戶無法使用的接口——被适配者
- 擴充卡類——與目标類是繼承關系,與需适配類是繼承關系——中間者
概述:
- 目标類:方法
- 需适配類:方法
- 擴充卡類:重寫目标類的方法,重寫需适配類的方法
- 用戶端:建立目标類類型的擴充卡類對象,目标類類型的擴充卡類對象調用目标類的方法、需适配類的方法
對象擴充卡模式:
結構:
- 目标類——用戶端能夠使用的接口——适配者
- 需适配類——客戶無法使用的接口——被适配者
- 擴充卡類——與目标類是繼承關系,與需适配類是關聯關系——中間者
概述:
- 目标類:方法
- 需适配類:方法
- 擴充卡類:需适配類對象
- 擴充卡類:設定需适配類對象方法,重寫目标類的方法
- 設定需适配類對象方法:(建立并)設定需适配類對象為字段
- 方法:需适配類對象調用需适配類的方法
- 用戶端:建立目标類類型的擴充卡類對象,目标類類型的擴充卡類對象調用方法
核心:
- 繼承
- 多态
- 目标類——用戶端能夠使用的接口——适配者
- 需适配類——客戶無法使用的接口——被适配者
- 擴充卡類——中間者
- 擴充卡類繼承目标類——協調适配者
- 擴充卡類通過需适配類對象調用需适配類的方法——協調被适配者——适配過程
- 用戶端可以隻知道擴充卡類,不知道需适配類
外觀模式(Facade)
描述:
- 為子系統中的一組接口提供一個一緻的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用
結構:
- 子系統類(多個)——被管理者
- 外觀類——與子系統類是關聯關系——管理者
概述:
- 子系統類:方法
- 外觀類:子系統類對象
- 外觀類:設定子系統類對象為方法,搭配方法
- 設定子系統類對象為方法:(建立并)設定子系統類對象為字段
- 搭配方法:可以使用多個子系統類對象調用子系統類的方法——搭配多種方案
- 用戶端建立外觀類對象,外觀類對象調用外觀類的方法
核心:
- 關聯關系
- 子系統類——被管理者
- 外觀類封裝多個子系統類對象和多個子系統類對象調用子系統類的方法
- 外觀類——管理者,搭配子系統類方法的調用内容和時序/步驟
- 用戶端隻知道外觀類,不知道子系統類
裝飾模式(Decorator)
别名:
- 裝飾者模式
- 裝飾器模式
- 包裝器模式(Wrapper)
描述:
- 動态地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活
結構:
- 抽象元件類
- 具體元件類——與抽象元件類是繼承關系——被裝飾者
- 抽象裝飾類——與抽象元件類是繼承關系,與抽象元件類是聚合關系
- 具體裝飾類——與抽象裝飾類是繼承關系——被裝飾者、裝飾者
概述:
- 抽象元件類:抽象方法
- 具體元件類:重寫抽象元件類的抽象方法為具體方法
- 抽象裝飾類:設定抽象元件類類型的具體元件類對象或抽象元件類類型的具體裝飾類對象方法,重寫抽象元件類的抽象方法為具體方法
- 設定抽象元件類類型的具體元件類對象或抽象元件類類型的具體裝飾類對象方法:(建立并)設定抽象元件類類型的具體元件類對象或抽象元件類類型的具體裝飾類對象為字段
- 具體裝飾類:重寫抽象裝飾類的具體方法為具體方法
- 具體方法:調用抽象元件類類型的具體元件類對象的具體元件類的具體方法或抽象元件類類型的具體裝飾類對象的具體裝飾類的具體方法
- 用戶端建立具體元件類對象,建立具體裝飾類對象,具體裝飾類對象調用設定抽象元件類類型的具體元件類對象或抽象元件類類型的具體裝飾類對象方法,具體裝飾類對象調用具體裝飾類的具體方法
核心:
- 繼承
- 多态
- 裝飾,嵌套
- 具體元件類——被裝飾者
- 具體裝飾類——被裝飾者、裝飾者
- 設定抽象元件類類型的具體元件類對象或抽象元件類類型的具體裝飾類對象方法——裝飾者包裝被裝飾者
- 具體元件類的具體方法——被裝飾者的固有内容
- 具體裝飾類的具體方法:調用被裝飾者的具體方法——被裝飾者的固有内容,裝飾者的具體方法——裝飾者的包裝内容,搭配固有和包裝的内容、時序/步驟
組合模式(Composite)
别名:
- 對象樹模式(Object Tree)
描述:
- 将對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得使用者對單個對象群組合對象的使用具有一緻性
結構:
- 元件類
- 葉子類——與元件類是繼承關系——樹葉
- 組合類——與元件類是繼承關系,與元件類是聚合關系——樹枝
概述:
- 元件類:抽象執行方法
- 葉子類:重寫元件類的抽象執行方法為具體執行方法
- 組合類:元件類類型的葉子類對象或元件類類型的組合類對象集合
- 組合類:重寫元件類的抽象執行方法為具體執行方法
- 組合類:添加元件方法,移除元件方法,具體執行方法
- 添加元件方法:添加元件類類型的葉子類對象或元件類類型的組合類對象到集合
- 移除元件方法:移除集合中元件類類型的葉子類對象或元件類類型的組合類對象
- 具體執行方法:周遊元件類類型的葉子類對象或元件類類型的組合類對象集合,對象調用具體執行方法
- 用戶端:建立組合類對象——樹根,建立組合類對象——樹枝,建立葉子類對象——樹葉,樹枝調用添加元件方法——添加樹枝或樹葉,樹根調用添加元件方法——添加樹枝或樹葉,樹根調用具體執行方法
核心:
- 繼承
- 多态
- 樹狀嵌套遞歸對象結構
- 用戶端以相同方式處理簡單和複雜元素/一緻地使用單個群組合對象
其他:
- 透明方式:元件類有管理子對象的方法,如:添加元件方法、删除元件方法,組合類、葉子類的行為一緻;葉子類繼承和實作該些方法沒有意義,違反接口隔離原則(ISP)
- 安全方式:元件類沒有管理子對象的方法,組合類有管理子對象的方法
橋接模式(Bridge)
描述:
- 将抽象部分與它的實作部分分離,使它們都可以獨立地變化
結構:
- 抽象實作類
- 具體實作類——與抽象實作類是繼承關系
- 抽象抽象類——與抽象實作類是聚合關系
- 具體抽象類——與抽象抽象類是繼承關系
概述:
- 抽象實作類:抽象方法
- 具體實作類:重寫抽象實作類的抽象方法為具體方法
- 抽象抽象類:抽象實作類類型的具體實作類對象
- 抽象抽象類:設定抽象實作類類型的具體實作類對象方法,抽象執行方法
- 具體抽象類:重寫抽象抽象類的抽象執行方法為具體執行方法
- 具體執行方法:抽象實作類類型的具體實作類對象調用具體實作類的具體方法
- 用戶端:建立抽象抽象類類型的具體抽象類對象,抽象實作類類型的具體實作類對象,抽象抽象類類型的具體抽象類對象調用設定抽象實作類類型的具體實作類對象方法,抽象抽象類類型的具體抽象類對象調用具體執行方法
核心:
- 繼承
- 多态
- 多元結構
- 合成聚合原則(C/ARP),聚合/組合
- 拆分抽象和實作,使用聚合/組合關系橋接
- 抽象:不是指抽象類和接口,指一個獨立次元/類層次,如手機品牌類型
- 實作:不是指具體類和實作類,指一個獨立次元/類層次,如手機軟體類型
- 聚合/組合:手機品牌類對象持有手機軟體類對象
- 橋接方式:手機品牌類對象通過手機軟體類對象使用手機軟體類的字段、方法,不必知道手機軟體類的狀态、行為——核心
- 無橋接方式:使用繼承:每個手機品牌類有手機軟體類,類的數量呈樹狀結構幾何遞增,難以維護
享元模式(Flyweight)
别稱:
- 緩存模式(Cache)
描述:
- 運用共享技術有效地支援大量大量細粒度的對象
結構:
- 抽象享元類
- 具體享元類——與抽象享元類是繼承關系——共享内容
- 具體不共享類——與抽象享元類是繼承關系——不共享内容
- 享元工廠類——與抽象享元類是聚合關系
概述:
- 抽象享元類:抽象方法
- 具體享元類:重寫抽象享元類的抽象方法為具體方法
- 具體不共享類:重寫抽象享元類的抽象方法為具體方法
- 享元工廠類:抽象享元類類型的具體享元類對象或抽象享元類類型的不共享類對象表
- 享元工廠類:添加抽象享元類類型的具體享元類對象或抽象享元類類型的不共享類對象方法,傳回抽象享元類類型的具體享元類對象或抽象享元類類型的不共享類對象方法
- 添加抽象享元類類型的具體享元類對象或抽象享元類類型的不共享類對象方法:(建立并)添加抽象享元類類型的具體享元類對象或抽象享元類類型的不共享類對象到表——要用才建立
- 傳回抽象享元類類型的具體享元類對象或抽象享元類類型的不共享類對象方法:查表,若無建立對象,若有傳回——沒有才建立
- 用戶端:建立享元工廠類對象,享元工廠類對象調用傳回抽象享元類類型的具體享元類對象或抽象享元類類型的不共享類對象方法,以建立抽象享元類類型的具體享元類對象或抽象享元類類型的不共享類對象,抽象享元類類型的具體享元類對象調用具體享元類的具體方法,象享元類類型的不共享類對象調用不共享類的具體方法
核心:
- 繼承
- 多态
- 不共享類,外部狀态——不共享内容
- 共享類,内部狀态——共享内容
- 共享資源、代碼和執行個體
- 用戶端傳遞外部狀态給享元工廠類和享元類,實作不共享内容和共享内容的整合
- 拆分和整合共享内容和不共享内容
記憶
- 代理模式(Proxy):代理。代理者和被代理者接口相同,能代理。類比:快遞員幫花店店員送花
- 擴充卡模式(Adapter):适配。适配者和被适配者接口不同,不能代理,隻能适配。類比:電源擴充卡适配不同電壓源和電器
- 外觀模式(Facade):管理,搭配多種方案。類似代理模式(Proxy):用戶端委托任務給外觀類對象,外觀類對象委托任務給多個子系統類對象。但委托者和被委托者無繼承、多态:無相同接口,不能代換;有關聯關系:委托者隻負責管理、委托任務。類比:狼王指揮狼群
- 裝飾模式(Decorator):裝飾,嵌套,搭配固有和包裝的内容、時序/步驟。類似外觀模式(Facade)。類比:給物品包裝盒子
- 組合模式(Composit):樹狀嵌套遞歸對象結構。用戶端以相同方式處理簡單和複雜元素/一緻地使用單個群組合對象。類似裝飾模式(Decorator)。類比:處理物品和包裝物品盒子的方式一緻
- 橋接模式(Bridge):多元結構,拆分抽象和實作,使用聚合/組合關系橋接。抽象和實作是兩個獨立次元,接口不同。類似代理模式(Proxy),避免組合模式(Composit)的樹狀結構。類比:不同手機品牌安裝不同手機軟體
- 享元模式(Flyweight):拆分和整合共享内容和不共享内容。類比:類似的商業網站使用同一伺服器資源、代碼和執行個體,依據網站所有者的不同具有不同的行為
參考資料
- 《大話設計模式》作者:程傑
- 常用設計模式有哪些? (refactoringguru.cn)
總結
結構型設計模式總結。
作者的話
- 感謝參考資料的作者/部落客
- 作者:夜悊
- 版權所有,轉載請注明出處,謝謝~
- 如果文章對你有幫助,請點個贊或加個粉絲吧,你的支援就是作者的動力~
- 文章在描述時有疑惑的地方,請留言,定會一一耐心讨論、解答
- 文章在認識上有錯誤的地方, 敬請批評指正
- 望讀者們都能有所收獲