👈?上一篇:組合模式
設計模式-專欄👈?
目 錄
- 橋接模式(Bridge Pattern)
- 定義
- 英文原話是:
- 直譯
- 理解
- 4個角色
- UML類圖
- 代碼示例
- 應用
- 優點
- 缺點
- 使用場景
- 示例解析:電視和遙控器
- UML類圖
橋接模式(Bridge Pattern)
定義
英文原話是:
- Bridge Pattern is a software design pattern that is used to overcome the limitations of the traditional inheritance.
- It decouples an abstraction from its implementation so that the two can vary independently.
- The bridge pattern consists of two parts: abstraction and implementation.
- The abstraction part defines the interface that the client uses to interact with the system.
- The implementation part implements the abstraction by providing the functionality required by the client.
直譯
- 橋接模式是一種用于克服傳統繼承局限性的軟件設計模式。
- 它將抽象部分與實現部分解耦,使得兩者可以獨立地變化。
- 橋接模式由兩部分組成:抽象部分和實現部分。
- 抽象部分定義了客戶端與系統交互的接口。
- 實現部分通過提供客戶端所需的功能來實現抽象部分。
理解
橋接模式(Bridge Pattern)從字面上理解,可以想象成一個橋梁連接了兩個不同的部分,使得這兩個部分可以相互通信或協作,而不需要彼此之間有直接的依賴關系。在軟件設計中,這兩個部分通常指的是抽象部分和實現部分。
在橋接模式中,抽象部分定義了一個接口(或抽象類),用于定義抽象層的行為。實現部分則實現了這個接口,提供了具體實現。這兩個部分通過組合的方式關聯在一起,而不是繼承。這樣做的好處是,抽象部分和實現部分可以獨立變化,只要它們遵循相同的接口規范。
橋接模式的主要目的是通過組合的方式建立抽象與實現之間的聯系,而不是通過繼承。
這允許開發人員在不修改抽象接口的情況下修改實現,從而提高了系統的靈活性和可擴展性。
同時,橋接模式也避免了多重繼承可能帶來的問題,如違背類的單一職責原則和降低復用性等。
4個角色
橋接模式(Bridge Pattern)是一種結構型設計模式,它將抽象部分與它的實現部分分離,使得它們可以獨立地變化。這種類型的設計模式屬于結構型模式,它通過提供抽象層和實現層之間的橋接結構,來實現二者的解耦。
UML類圖
橋接模式包含以下四個角色:
- 抽象化(Abstraction)角色:定義抽象類的接口,并保存一個對實現化對象的引用。
- 擴展抽象化(RefinedAbstraction)角色:抽象化角色的子類,實現它要求的業務邏輯,并通過組合關系調用實現化角色中的業務方法。
- 實現化(Implementor)角色:這個接口定義了實現化角色的接口,但不提供具體的實現。這個接口必須被實現化角色的具體類來實現。
- 具體實現化(ConcreteImplementor)角色:實現化角色接口的具體實現類。
代碼示例
以下是一個Java示例來演示橋接模式:
package com.polaris.designpattern.list2.structural.pattern5.bridge.classicdemo;// 實現化角色接口
interface Implementor { void operationImpl();
} // 具體實現化角色
class ConcreteImplementorA implements Implementor { @Override public void operationImpl() { System.out.println("操作A的實現"); }
} class ConcreteImplementorB implements Implementor { @Override public void operationImpl() { System.out.println("操作B的實現"); }
} // 抽象化角色
abstract class Abstraction { protected Implementor implementor; public Abstraction(Implementor implementor) { this.implementor = implementor; } public abstract void operation();
} // 擴展抽象化角色
class RefinedAbstraction extends Abstraction { public RefinedAbstraction(Implementor implementor) { super(implementor); } @Override public void operation() { // 在調用實現化角色的方法之前或之后,可以添加一些邏輯 System.out.println("擴展操作前..."); implementor.operationImpl(); System.out.println("擴展操作后..."); }
} // 客戶端代碼
public class BridgePatternDemo { public static void main(String[] args) { Implementor implementorA = new ConcreteImplementorA(); Abstraction abstraction = new RefinedAbstraction(implementorA); abstraction.operation();System.out.println("-----------");Implementor implementorB = new ConcreteImplementorB(); abstraction = new RefinedAbstraction(implementorB); abstraction.operation(); }
}/* Output:
擴展操作前...
操作A的實現
擴展操作后...
-----------
擴展操作前...
操作B的實現
擴展操作后...
*///~
在這個例子中,Implementor
是實現化角色接口,ConcreteImplementorA
和 ConcreteImplementorB
是兩個具體實現化角色。Abstraction
是抽象化角色,它持有一個對實現化角色的引用,而 RefinedAbstraction
是擴展抽象化角色,它擴展了 Abstraction
的功能。客戶端代碼通過組合關系,將實現化角色和抽象化角色組合在一起,實現了二者的解耦。
應用
再來總結下,橋接模式(Bridge Pattern)是一種結構型設計模式,它通過將抽象部分與實現部分解耦,使得它們可以獨立地變化。
橋接模式通常用于以下情況:
- 抽象和實現需要獨立變化:當抽象部分和實現部分都需要獨立擴展時,可以使用橋接模式。例如,不同的數據庫系統(抽象部分)可能需要不同的驅動程序(實現部分)。
- 需要跨多個平臺實現:當系統需要在不同的平臺上運行時,可以使用橋接模式來封裝平臺相關的代碼。
- 避免繼承層次過深:當使用繼承來實現多個維度的變化時,可能會導致繼承層次過深,使得代碼難以理解和維護。橋接模式通過組合代替繼承,可以解決這個問題。
優點
- 分離抽象與實現:橋接模式將抽象部分與實現部分分離,使得它們可以獨立地變化。這增加了系統的靈活性和可擴展性。
- 減少繼承層次:通過組合關系替代繼承關系,減少了繼承層次,降低了系統的復雜度。
- 支持動態切換實現:在運行時,可以動態地切換實現部分,而不需要修改抽象部分的代碼。
- 符合開閉原則:橋接模式符合開閉原則,即對擴展開放,對修改封閉。當需要添加新的實現時,只需要添加新的實現類,而不需要修改已有的代碼。
缺點
- 增加了系統的復雜性:由于引入了抽象部分和實現部分兩個層次,增加了系統的復雜性。對于簡單的系統來說,可能不需要使用橋接模式。
- 可能增加了系統開銷:在運行時,需要維護抽象部分和實現部分之間的關聯關系,這可能會增加一些額外的開銷。
使用場景
以下是一些適合使用橋接模式的場景:
- 多種操作系統:當軟件需要在多種操作系統上運行時,可以使用橋接模式來封裝與操作系統相關的代碼。這樣,只需要編寫一次抽象部分的代碼,就可以通過更換不同的實現部分來適應不同的操作系統。
- 多種數據庫系統:當軟件需要與多種數據庫系統進行交互時,可以使用橋接模式來封裝與數據庫相關的代碼。這樣,只需要編寫一次抽象部分的代碼,就可以通過更換不同的實現部分來適應不同的數據庫系統。
- 多種圖形用戶界面:當軟件需要支持多種圖形用戶界面(如Windows、Mac、Linux等)時,可以使用橋接模式來封裝與界面相關的代碼。這樣,只需要編寫一次抽象部分的代碼,就可以通過更換不同的實現部分來適應不同的界面風格。
- 多種網絡協議:當軟件需要與多種網絡協議進行通信時,可以使用橋接模式來封裝與網絡協議相關的代碼。這樣,只需要編寫一次抽象部分的代碼,就可以通過更換不同的實現部分來適應不同的網絡協議。
示例解析:電視和遙控器
在生活中,一個常見的橋接模式的例子是電視和遙控器。
電視(抽象化角色)提供了觀看節目的基本功能,而遙控器(實現化角色)則負責控制電視的不同操作(如換臺、調節音量等)。
電視本身不關心遙控器是如何實現的,只要它符合一定的接口規范(如紅外信號、藍牙等)。
同樣,遙控器也可以控制不同類型的電視,只要電視也符合相應的接口規范。
UML類圖
下面是一個簡化的代碼示例,用于說明這個場景:
package com.polaris.designpattern.list2.structural.pattern5.bridge.remotecontroldemo;//遙控器接口(Implementor)
interface RemoteControl {//換臺void changeChannel(int channel);//調節音量void adjustVolume(int volume);// ... 其他控制方法
}//具體遙控器(ConcreteImplementor)
class InfraredRemoteControl implements RemoteControl {@Overridepublic void changeChannel(int channel) {System.out.println("使用紅外遙控器換臺到: " + channel);}@Overridepublic void adjustVolume(int volume) {System.out.println("使用紅外遙控器調節音量到: " + volume);}// ... 實現其他控制方法
}//電視抽象類(Abstraction)
abstract class Television {protected RemoteControl remoteControl;public Television(RemoteControl remoteControl) {this.remoteControl = remoteControl;}public abstract void turnOn();public abstract void turnOff();// 使用遙控器來控制電視 public void watch() {System.out.println("正在看電視...");remoteControl.changeChannel(10); // 假設切換到10頻道 remoteControl.adjustVolume(50); // 假設調節音量到50 }
}//具體電視類(RefinedAbstraction)
class LEDTelevision extends Television {public LEDTelevision(RemoteControl remoteControl) {super(remoteControl);}@Overridepublic void turnOn() {System.out.println("LED電視已打開");}@Overridepublic void turnOff() {System.out.println("LED電視已關閉");}
}//客戶端代碼
public class BridgePatternDemo {public static void main(String[] args) {// 創建一個紅外遙控器 RemoteControl infraredRemote = new InfraredRemoteControl();// 創建一個LED電視,并使用紅外遙控器 Television ledTv = new LEDTelevision(infraredRemote);ledTv.turnOn(); // 打開電視 ledTv.watch(); // 使用遙控器觀看電視 ledTv.turnOff(); // 關閉電視 }
}/* Output:
LED電視已打開
正在看電視...
使用紅外遙控器換臺到: 10
使用紅外遙控器調節音量到: 50
LED電視已關閉
*///~
在這個例子中,Television
是抽象化角色,它定義了電視的基本操作(如打開、關閉),并持有對 RemoteControl
(遙控器)的引用。LEDTelevision
是擴展抽象化角色,它擴展了電視的基本功能,并提供了具體的實現。RemoteControl
是實現化角色接口,定義了遙控器需要實現的方法。InfraredRemoteControl
是具體實現化角色,它實現了紅外遙控器的功能。
客戶端代碼創建了一個 InfraredRemoteControl
對象和一個 LEDTelevision
對象,并將遙控器對象傳遞給電視對象。這樣,電視就可以通過遙控器來控制自己的行為了。
這個例子展示了橋接模式如何使得抽象化角色(電視)和實現化角色(遙控器)可以獨立地變化。
上一篇:組合模式👈?
設計模式-專欄👈?