橋接模式的簡單分析

2022-02-10 06:34:48 字數 2508 閱讀 3784

1:什麼是橋接

在橋接模式中,不太好理解的就是橋接的概念。什麼是橋接?為何需要橋接?如何橋接?把這些問題搞清楚了,也就基本明白橋接的含義了。

乙個乙個來,先看看什麼是橋接?所謂橋接,通俗點說就是在不同的東西之間搭乙個橋,讓它們能夠連線起來,可以相互通訊和使用。那麼在橋接模式中到底是給什麼東西來搭橋呢?就是為被分離了的抽象部分和實現部分來搭橋,比如前面示例中在抽象的訊息和具體訊息傳送之間搭個橋。

但是這裡要注意乙個問題,在橋接模式中的橋接是單向的,也就是只能是抽象部分的物件去使用具體實現部分的物件,而不能反過來,也就是個單向橋。

2:為何需要橋接

為了達到讓抽象部分和實現部分都可以獨立變化的目的,在橋接模式中,是把抽象部分和實現部分分離開來的,雖然從程式結構上是分開了,但是在抽象部分實現的時候,還是需要使用具體的實現的,這可怎麼辦呢?抽象部分如何才能呼叫到具體實現部分的功能呢?很簡單,搭個橋就可以了。搭個橋,讓抽象部分通過這個橋就可以呼叫到實現部分的功能了,因此需要橋接。

3:如何橋接

這個理解上也很簡單,只要讓抽象部分擁有實現部分的介面物件,就橋接上了,在抽象部分即可通過這個介面來呼叫具體實現部分的功能。也就是說,橋接在程式上體現了在抽象部分擁有實現部分的介面物件,維護橋接就是維護這個關係。

4:獨立變化

橋接模式的意圖是使得抽象和實現可以獨立變化,都可以分別擴充。也就是說抽象部分和實現部分是一種非常鬆散的關係。從某個角度來講,抽象部分和實現部分是可以完全分開的,獨立的,抽象部分不過是乙個使用實現部分對外介面的程式罷了。

如果這麼看橋接模式的話,就類似於策略模式了。抽象部分需要根據某個策略,來選擇真實的實現,也就是說橋接模式的抽象部分相當於策略模式的上下文。更原始的就直接類似於面向介面程式設計,通過介面分離的兩個部分而已。但是別忘了,橋接模式的抽象部分,是可以繼續擴充套件和變化的,而策略模式只有上下文,是不存在所謂抽象部分的。

那抽象和實現為何還要組合在一起呢?原因是在抽象部分和實現部分還是存在內部聯絡的,抽象部分的實現通常是需要呼叫實現部分的功能來實現的。

5:動態變換功能

由於橋接模式中的抽象部分和實現部分是完全分離的,因此可以在執行時動態組合具體的真實實現,從而達到動態變換功能的目的。

從另外乙個角度看,抽象部分和實現部分沒有固定的繫結關係,因此同乙個真實實現可以被不同的抽象物件使用;反過來,同乙個抽象也可以有多個不同的實現。就像前面示例的那樣,比如,站內短訊息的實現功能,可以被普通資訊、加急訊息或是特急訊息等不同的訊息物件使用;反過來,某個訊息具體的傳送方式,可以是站內短訊息,或者是e-mail,也可以是手機短訊息等具體的傳送方式。

6:退化的橋接模式

如果implementor僅有乙個實現,那麼就沒有必要建立implementor介面了,這是一種橋接模式退化的情況。這個時候abstraction和implementor是一對一的關係,雖然如此,也還是要保持它們的分離狀態,這樣的話,它們才不會相互影響,才可以分別擴充套件。

也就是說,就算不要implementor介面了,也要保持abstraction和implementor是分離的,模式的分離機制仍然是非常有用的。

7:橋接模式和繼承

繼承是擴充套件物件功能的一種常見手段,通常情況下,繼承擴充套件的功能變化緯度都是一緯的,也就是變化的因素只有一類。

對於出現變化因素有兩類的,也就是有兩個變化緯度的情況,繼承實現就會比較痛苦。比如上面的示例,就有兩個變化緯度,乙個是訊息的類別,不同的訊息類別處理不同;另外乙個是訊息的傳送方式。

從理論上來說,如果用繼承的方式來實現這種有兩個變化緯度的情況,最後實際的實現類應該是兩個緯度上可變數量的乘積那麼多個。比如上面的示例,在訊息類別的緯度上,目前的可變數量是3個,普通資訊、加急訊息和特急訊息;在訊息傳送方式的緯度上,目前的可變數量也是3個,站內短訊息、email和手機短訊息。這種情況下,如果要實現全的話,那麼需要的實現類應該是:3 × 3 = 9個。

如果要在任何乙個緯度上進行擴充套件,都需要實現另外乙個緯度上的可變數量那麼多個實現類,這也是為何會感覺擴充套件起來很困難。而且隨著程式規模的加大,會越來越難以擴充套件和維護。

而橋接模式就是用來解決這種有兩個變化緯度的情況下,如何靈活地擴充套件功能的乙個很好的方案。其實,橋接模式主要是把繼承改成了使用物件組合,從而把兩個緯度分開,讓每乙個緯度單獨去變化,最後通過物件組合的方式,把兩個緯度組合起來,每一種組合的方式就相當於原來繼承中的一種實現,這樣就有效地減少了實際實現的類的個數。

從理論上來說,如果用橋接模式的方式來實現這種有兩個變化緯度的情況,最後實際的實現類應該是兩個緯度上可變數量的和那麼多個。同樣是上面那個示例,使用橋接模式來實現,實現全的話,最後需要的實現類的數目應該是:3 + 3 = 6個。

這也從側面體現了,使用物件組合的方式比繼承要來得更靈活。

8:橋接模式的呼叫順序示意圖

橋接模式的呼叫順序如圖24.8所示。

橋接模式的簡單實現

最近經常碰到橋接模式的需求。所謂橋接模式即 將網路側分配的ip 可能是公網ip,也可能是私網ip 直接分配給連線到該路由裝置的pc或其它上網裝置。解釋的不太清楚 之前畫的圖也一時找不到了,後續有空再把圖加上就會解釋的更清楚一些。具體實現 關閉 對wan口的dhcp 我這個裝置的wan口名稱是wan0...

php橋接模式應用案例分析

橋接模式是將抽象部分與它的實現部分分離,使它們都可以獨立地變化。示例 當乙個資訊時 根據傳送渠道分為 qq訊息 email訊息 簡訊訊息等 根據訊息型別分為 普通 警告 危急等 每種訊息都有三種型別 普通qq訊息 警告qq訊息 危急qq訊息.每種情況單獨寫乙個類就需要寫九個,如果擴充套件乙個型別,就...

初探簡單橋接

目地 同網段的兩台主機能夠互相ping通。環境 主機a vmnet1 模式 nevice ens32 name ens32 onboot yes apaddr 192.192.74.76 netmask 255.255.255.0 gateway 192.168.74.2 dns1 114.114....