設計模式之Bridge

2021-08-29 03:08:01 字數 2545 閱讀 1323

bridge定義 :

將抽象和行為劃分開來,各自獨立,但能動態的結合.

為什麼使用?

通常,當乙個抽象類或介面有多個具體實現(concrete subclass),這些concrete之間關係可能有以下兩種:

1. 這多個具體實現之間恰好是並列的,如前面舉例,打樁,有兩個concrete class:方形樁和圓形樁;這兩個形狀上的樁是並列的,沒有概念上的重複,那麼我們只要使用繼承就可以了.

2.實際應用上,常常有可能在這多個concrete class之間有概念上重疊.那麼需要我們把抽象共同部分和行為共同部分各自獨立開來,原來是準備放在乙個介面裡,現在需要設計兩個介面,分別放置抽象和行為.

例如,一杯咖啡為例,有中杯和大杯之分,同時還有加奶 不加奶之分. 如果用單純的繼承,這四個具體實現(中杯 大杯 加奶 不加奶)之間有概念重疊,因為有中杯加奶,也有中杯不加奶, 如果再在中杯這一層再實現兩個繼承,很顯然混亂,擴充套件性極差.那我們使用bridge模式來實現它.

如何實現?

以上面提到的咖啡 為例. 我們原來打算只設計乙個介面(抽象類),使用bridge模式後,我們需要將抽象和行為分開,加奶和不加奶屬於行為,我們將它們抽象成乙個專門的行為介面.

先看看抽象部分的介面程式碼:

public abstract class coffee

public sodaimp getcoffeeimp()

public abstract void pourcoffee();

}其中coffeeimp 是加不加奶的行為介面,看其程式碼如下:

public abstract class coffeeimp

現在我們有了兩個抽象類,下面我們分別對其進行繼承,實現concrete class:

//中杯

public class mediumcoffee extends coffee

public void pourcoffee()}}

//大杯

public class supersizecoffee extends coffee

public void pourcoffee()}}

上面分別是中杯和大杯的具體實現.下面再對行為coffeeimp進行繼承:

//加奶

public class milkcoffeeimp extends coffeeimp

public void pourcoffeeimp()

}//不加奶

public class fragrantcoffeeimp extends coffeeimp

public void pourcoffeeimp()

}bridge模式的基本框架我們已經搭好了,別忘記定義中還有一句:動態結合,我們現在可以喝到至少四種咖啡:

1.中杯加奶

2.中杯不加奶

3.大杯加奶

4.大杯不加奶

看看是如何動態結合的,在使用之前,我們做個準備工作,設計乙個單態類(singleton)用來hold當前的coffeeimp:

public class coffeeimpsingleton

public static coffeeimp getthecoffeeimp()

}看看中杯加奶 和大杯加奶 是怎麼出來的:

//拿出牛奶

coffeeimpsingleton coffeeimpsingleton = new coffeeimpsingleton(new milkcoffeeimp());

//中杯加奶

mediumcoffee mediumcoffee = new mediumcoffee();

mediumcoffee.pourcoffee();

//大杯加奶

supersizecoffee supersizecoffee = new supersizecoffee();

supersizecoffee.pourcoffee();

注意: bridge模式的執行類如coffeeimp和coffee是一對一的關係, 正確建立coffeeimp是該模式的關鍵,

bridge模式在ejb中的應用

ejb中有乙個data access object (dao)模式,這是將商業邏輯和具體資料資源分開的,因為不同的資料庫有不同的資料庫操作.將操作不同資料庫的行為獨立抽象成乙個行為介面dao.如下:

1.business object (類似coffee)

實現一些抽象的商業操作:如尋找乙個使用者下所有的訂單

涉及資料庫操作都使用daoimplementor.

2.data access object (類似coffeeimp)

一些抽象的對資料庫資源操作

3.daoimplementor 如orderdaocs, orderdaooracle, orderdaosybase(類似milkcoffeeimp fragrantcoffeeimp)

具體的資料庫操作,如"insert into "等語句,orderdaooracle是oracle orderdaosybase是sybase資料庫.

4.資料庫 (cloudscape, oracle, or sybase database via jdbc api)

設計模式之Bridge模式

本文內容是通過學習 設計模式解析 by alan shalloway,james r.trott 一書所總結的心得。博主想通過先提出問題,再解決問題的方式來讓讀者實際體驗一把bridge模式的優勢。這也是 設計模式解析 一書中採用的講解流程,對於讀者理解會有很大幫助 文中的案例也是使用的書中提供的案...

設計模式之bridge 橋 模式

bridge橋接模式是一種結構型模式,它主要應對的是 由於型別的固有羅輯,使得型別具有兩個或兩個以上的緯度變化。也就是要求抽象不應依賴於實現細節,實現細節應依賴於抽象。設計模式 中說到將抽象部分與實現部分分離,使他們可以獨立的變化。舉個例子更清楚些,好像我們平時玩的遊戲中有ps版的,但是不是大家都有...

設計模式 Bridge模式

原來對bridge模式理解不是很深入,感覺和build模式很相似,今天又看了四人幫的關於bridge模式的描述,有些新的理解 先來說下適用性 1 不想抽象和實現之間有乙個固定的繫結關係。因為程式在執行時實現部分可以被選擇或者切換 2 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時br...