【Java】設計模式--結構型模式

TypantK發表於2019-03-23

目錄

介面卡模式

類的介面卡模式(extends + implements)[Adapter的類]

物件的介面卡模式(implements + 物件) [這裡的物件指的是Adaptee的物件]

介面的介面卡模式(abstract)[ 將介面適配成抽象類與類進行溝通 ]

裝飾者模式(AOP)

代理模式(Proxy)

外觀模式(Facade)

橋接模式(Bridge)

組合模式(Composite)

享元模式(Flyweight)共享單元(物件)


 

 

介面卡模式


希望由某個類A(Adapter)呼叫方法B,但是方法B是類B(Adaptee)中的方法,於是用一個目標介面(Target)合併B中方法

(簡單來說:就是類A呼叫類B方法)

*Adapter:實現了目標介面,通過包裝一個需要適配的物件,將原介面轉為目標介面

*Adaptee:需要適配的類或者介面(需要呼叫的方法所在類)

*Target:客戶所期待的介面(所希望這個類有的方法),可以是具體的類也可以是抽象類或者介面

類的介面卡模式(extends + implements)[Adapter的類]

*希望將一個類轉換成適合另一個新介面的新類:繼承原有子類、實現新介面

 

物件的介面卡模式(implements + 物件) [這裡的物件指的是Adaptee的物件]

*希望將一個物件轉換成適應另一個介面的物件

 

介面的介面卡模式(abstract)[ 將介面適配成抽象類與類進行溝通 ]

*這個有點特別,因為並不需要呼叫別的類的方法,而是減少對於介面的實現,如圖類AAA通過繼承一個抽象類,只實現了A方法

 

裝飾者模式(AOP)


顧名思義,裝飾 --> 變得更厲害,能裝飾什麼呢?屬性?似乎有點沒用,不如直接加。方法?好像有點用哦

*繼承實現裝飾者模式相同功能為什麼不好

裝飾是建構函式引數傳遞進行增強

如果為了某個功能而產生子類(繼承)那麼那個體系是非常臃腫的

*例如:

你有個物件有個功能 是在N年前建立的,如今你覺得功能不夠用了 寫個類把物件傳進來就可以解決問題(動態增加)

如果這個功能寫錯了 我就把自己寫的功能去掉又不影響以前的功能靈活性相當強的(動態撤銷)

 

代理模式(Proxy)


代理模式和裝飾模式非常類似,甚至程式碼都類似。

*二者最主要的區別是:

代理模式中,代理類對被代理的物件有控制權,決定其執行或者不執行。

而裝飾模式中,裝飾類對代理物件沒有控制權,只能為其增加一層裝飾,以加強被裝飾物件的功能,僅此而已

*測試用例:

 

外觀模式(Facade)


外觀模式是為了解決類與類之間的依賴關係的,像spring一樣,可以將類和類之間的關係配置到配置檔案中。

而外觀模式就是將他們的關係放在一個Facade類中,降低了類之間的耦合度,該模式中沒有涉及到介面

 

Facade類(注入其他類)

 

橋接模式(Bridge)


橋接的用意是:將抽象化與實現化解耦,使得二者可以獨立變化,像我們常用的JDBC橋DriverManager一樣,JDBC進行連線資料庫的時候,在各個資料庫之間進行切換,基本不需要動太多的程式碼,甚至絲毫不用動,原因就是JDBC提供統一介面,每個資料庫提供各自的實現,用一個叫做資料庫驅動的程式來橋接就行了

//註冊資料庫驅動程式
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(dbUrl, dbUserName, dbPassWord);


--------------------- 
作者:終點 
來源:CSDN 
原文:https://blog.csdn.net/zhangerqing/article/details/8239539 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

我的理解就是,在需要多種實現自由切換時,一般的做法可能是寫一個基本類(抽象類),然後不同的實現需求就都繼承這個類來實現,使用的是繼承

而*橋接模式是把方法實現的部分分離出來需要哪種實現就傳入哪種實現進抽象類的實現類,就像傳入一個引數給建構函式一樣,只不過我們傳的是方法的實現並且使用的是耦合。而所謂的橋,就是連線抽象和實現的類(MyBridge)

需要分離不同實現的部分method()以及不同的實現SourceA/SourceB

實現的這一部分可以獨立變化

抽象的這一部分可以獨立的變化(*為什麼使用抽象類原因)

連線抽象和實現後,變成一個“完整”的類(所謂的橋

 

組合模式(Composite)


組合模式有時又叫部分-整體模式在處理類似樹形結構的問題時比較方便

*部分-整體:也就是由部分組成了一個整體,那麼就要有一個整體以及若干個部分(有點類似於樹的資料結構)

以二叉樹來舉例,每一個結點都是上一層的部分,同時也是下一層的整體

Test

 

 

享元模式(Flyweight)共享單元(物件)


享元模式的主要目的是實現物件的共享,即共享池,當系統中物件多的時候可以減少記憶體的開銷,通常與工廠模式一起使用

*個人理解:有很多地方需要某個類的物件,如果每個地方都建立,就會造成浪費,為什麼不用一個池來管理呢,如果需要此物件,就從池傳過去。

享元模式的核心在於享元工廠類(FlyweightFactory),享元工廠類的作用在於提供一個用於儲存享元物件的享元池

使用者需要物件時,首先從享元池中獲取;如果享元池中不存在,則建立一個新的享元物件返回給使用者,並在享元池中儲存該新增物件

 

 

 

 

 

相關文章