結構模式

開放

2.1 適配器

適配器(Adapter)是一種結構設計模式,旨在通過專門創建的接口來組織對象的功能的使用,這些對像不可用於修改。

官方的定義有點玄乎,但如果用自己的話說,適配器就是一種設計模式,可以讓接口不兼容的對像一起工作

適配器模式

用於組織對像功能的使用,這些功能不能通過專門創建的接口進行修改。創建了一個具有所需接口的附加類,該類又調用所需對象(沒有所需接口)的方法。

重要的!如果在代碼中您遇到類的後綴 Adapter,那麼您完全有權利認為該類充當適配器並且與根據上述方案工作的一組類相關聯。

它用於系統支持所需數據和行為但具有不適當接口的情況。Adapter 模式最常見的用途是創建一個繼承自新的或現有抽像類的類。

優勢:

  • 過渡到使用其他外部類不需要重構系統本身,多實現一個 Adapter 類就足夠了。
  • 獨立於外部類的實現(我們無法更改其代碼的庫中的類)。您的程序變得獨立於外部類的接口。

2.2 裝飾器

裝飾器是一種結構設計模式,用於動態地將附加行為附加到對象。裝飾器模式為子類化擴展功能的做法提供了一個很好且靈活的替代方案。

裝飾者模式

用於將附加義務動態連接到對象。

你們中的許多人會問:如何動態地(在程序運行時)向對象添加新行為?一個物體可以由碎片組裝而成,也就是小物體。還記得 servlet 中的過濾器鏈嗎?還是使用 filter()、map()、list() 編寫查詢時的 Stream API?

IntStream.of(50, 60, 70, 80, 90).filter(x -> x < 90).map(x -> x + 10).limit(3).forEach(System.out::print);

裝飾者模式的優點:

  • 無需創建子類來擴展對象的功能。
  • 在任何地方動態連接新功能的能力:在 ConcreteComponent 對象的主要功能之前或之後。

2.3 代理

代理是一種結構設計模式,它提供一個對象來控制對另一個對象的訪問,攔截並傳遞它的所有調用。

代理人(Proxy)

代理模式提供了一個替代對象來代替真實對象。該對象控制對原始對象的訪問。經常使用。

還記得我們如何使用 Mockito 框架並使用 Mockito.spy() 方法或 @Spy 註釋攔截對真實對象的調用嗎?就在那時創建了一個特殊的 Proxy 對象,通過它傳遞對原始對象的所有調用。

然後我們可以通過向對象添加規則來管理這些調用。沒錯——原始對像沒有改變,使用它變得更加靈活。當我們不從我們的代碼中調用代理對象,而是將它傳遞到某個地方時,它特別有用。從而控制兩個獨立於我們的對象的通信。

按用途分類的代理類型:

  • 記錄代理:記錄所有對“主題”的調用及其參數。
  • 遠程代理(remote proxies):提供與位於不同地址空間或遠程機器上的“Subject”的通信。它還可能負責對請求及其參數進行編碼,並將編碼後的請求發送給真正的“主題”。
  • 虛擬代理(virtual proxies):保證真正的“Subject”只在真正需要的時候才被創建。它還可以緩存一些關於真實“Subject”的信息來延遲它的創建。
  • Copy-on-write:當客戶端執行某些操作時提供“主題”的副本(“虛擬代理”的特例)。
  • 保護代理:可以檢查調用者是否具有發出請求所需的權限。
  • 緩存代理:在將計算結果提供給可以共享結果的多個客戶端之前提供計算結果的臨時存儲。
  • 篩選代理:保護“主題”免受危險客戶的侵害(反之亦然)。
  • Synchronization Proxy:在異步多線程環境中對“Subject”進行同步訪問控制。
  • “智能”鏈接(智能引用代理):創建指向“主題”的鏈接時執行其他操作,例如,計算指向“主題”的活動鏈接數。

2.4 橋樑

橋接模式是一種結構設計模式,用於“分離抽象和實現,使它們可以獨立改變”。

橋接模式使用封裝、聚合,可以使用繼承來分擔類之間的責任。

橋

當抽象和實現分離時,它們可以獨立改變。換句話說,當通過橋接模式實現時,改變接口的結構不會干擾改變實現的結構。

將這樣的抽象考慮為圖形。形狀有很多種,每一種都有自己的屬性和方法。但是,有一些東西可以將所有數字結合在一起。例如,每個形狀必須能夠繪製自身、縮放等。

同時,根據操作系統或圖形庫的類型,繪製圖形可能會有所不同。形狀應該能夠在各種圖形環境中自行繪製。但是在每個形狀中實現所有的繪製方法,或者每次繪製方法改變時都修改形狀是不切實際的。

在這種情況下,橋接模式會有所幫助,它允許您創建將在各種圖形環境中實現繪圖的新類。使用這種方法,可以很容易地添加新形狀和繪製它們的方法。

圖中箭頭表示的連接可以有 2 種含義:a) “一種”,根據 Liskov 替換原則,和 b) 抽象的可能實現之一。語言通常使用繼承來實現 a) 和 b),這往往會使類層次結構膨脹。

橋正是為了解決這個問題:對像是由層次結構 A 和層次結構 B 的類的對象成對創建的,層次結構 A 內的繼承根據 Liskov 具有“多樣性”的含義,對於“實現”的概念抽象”使用了從對象 A 到其配對對象 B 的鏈接。

2.5 門面

Facade 模式是一種結構設計模式,它通過減少對單個對象的所有可能的外部調用來隱藏系統的複雜性,該對象將它們委託給系統中的適當對象。

門面模板

例如,如果不希望與子系統強耦合,或者子系統的實現可能會改變,如何為子系統提供具有一組不同實現或接口的統一接口?

定義一個與子系統的交互點——一個外觀對象,它提供與子系統的公共接口,並賦予它與其組件交互的責任。外觀是一個外部對象,它為子系統服務提供單一入口點。

其他子系統組件的實現是私有的,對外部組件不可見。Facade 對象提供了一個 GRASP 模式的實現 Resistant to changes 在保護子系統實現中免受變化方面。

重要的!當我們想要完全隱藏某些對象組並通過我們的對像傳遞與它們的所有通信時,使用此模式。如果你只是想對對象的通信過程提供一些控製而不一定要隱藏它們,那麼最好使用代理模式。

1
任務
Module 3 a ɛto so abien,  等級 16課堂 1
上鎖
Through the Nail with a Microscope
task4101
1
任務
Module 3 a ɛto so abien,  等級 16課堂 1
上鎖
Signature Recipe
task4102
1
任務
Module 3 a ɛto so abien,  等級 16課堂 1
上鎖
Surprise, Anonymous!
task4103
1
任務
Module 3 a ɛto so abien,  等級 16課堂 1
上鎖
Fantastic Creatures
task4104
1
任務
Module 3 a ɛto so abien,  等級 16課堂 1
上鎖
Alchemy Library
task4105
留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言