設計模式之 —— 橋接模式
概述:將抽象部分與他的實現部分分離,這樣抽象化與實現化解耦,使他們可以獨立的變化.如何實現解耦的呢,就是通過提供抽象化和實現化之間的橋接結構.
應用場景:實現系統可能有多個角度分類,每一種角度都可能變化.
解釋:橋接模式將繼承模式轉化成關聯關係,他降低了類與類之間的耦合度,減少了系統中類的數量,也減少了程式碼量.
優點:
分離抽象介面及其實現部分.提高了比繼承更好的解決方案.
橋接模式提高了系統的可擴充性,在兩個變化維度中任意擴充套件一個維度,都不需要修改原來的系統.
實現細節對客戶不透明,可以隱藏實現細節.
缺點:橋接模式的引入會增加系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行程式設計.
結構
橋樑模式所涉及的角色有:
抽象化(Abstraction)角色:抽象化給出的定義,並儲存一個對實現化物件的引用。
修正抽象化(Refined Abstraction)角色:擴充套件抽象化角色,改變和修正父類對抽象化的定義。
實現化(Implementor)角色:這個角色給出實現化角色的介面,但不給出具體的實現。必須指出的是,這個接 口不一定和抽象化角色的介面定義相同,實際上,這兩個介面可以非常不一樣。實現化角色應當只給出底層操作,而抽象化角色應當只給出基於底層操作的更高一層 的操作。
具體實現化(Concrete Implementor)角色
例子1:
一個表就一個錶帶?
還是,一個表+多個可更換的錶帶?
例子2:程式碼分析
這裡寫圖片描述
package bridge; /** * 電腦品牌 */ public interface Brand { void sale(); } // 建立電腦牌子 class Lenovo implements Brand { @Override public void sale() { System.out.println("出售聯想"); } } class Dell implements Brand { @Override public void sale() { System.out.println("出售戴爾"); } } // 新增牌子是十分方便的 class Shenzhou implements Brand { @Override public void sale() { System.out.println("出售神州"); } }
package bridge;
// 電腦型別+ 獲得 品牌的引用
public class Computer {
protected Brand brand;
public Computer(Brand b) {
this.brand = b;
}
public void sale(){
brand.sale();
}
}
// 建立電腦型別
class Desktop extends Computer {
public Desktop(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
System.out.println("出售臺式電腦");
}
}
class Laptop extends Computer {
public Laptop(Brand b) {
super(b);
}
@Override
public void sale() {
super.sale();
System.out.println("出售筆記本");
}
}
public class Client {
public static void main(String[] args) {
// 這樣就筆記輕鬆的獲得牌子 + 型別
Computer c = new Laptop(new Lenovo());
c.sale();
Computer c2 = new Desktop(new Shenzhou());
c2.sale();
}
}
橋接模式和介面卡模式的區別:
共同點:橋接和介面卡都是讓兩個東西配合工作
不同點:出發點不同。
介面卡:改變已有的兩個介面,讓他們相容,讓他們同時工作。
橋接模式:分離抽象化和實現,目的是分離。橋好了之後,兩邊的東西還可以變化。
橋接模式將繼承關係轉換為關聯關係,從而降低了類與類之間的耦合,減少了程式碼編寫量。