說真的在此之前,幾乎沒有對于橋接模式的應用場景概念。
橋接(Bridge)是用于把抽象化與實作化解耦,使得二者可以獨立變化。這種類型的設計模式屬于結構型模式,它通過提供抽象化和實作化之間的橋接結構,來實作二者的解耦。
這種模式涉及到一個作為橋接的接口,使得實體類的功能獨立于接口實作類。這兩種類型的類可被結構化改變而互不影響。
我們通過下面的執行個體來示範橋接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象類方法但是不同的橋接實作類,來畫出不同顔色的圓。
概述
-
意圖
将抽象部分與實作部分分離,使它們都可以獨立的變化。
-
主要解決
在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴充起來不靈活。
-
何時使用
實作系統可能有多個角度分類,每一種角度都可能變化。
-
如何解決
把這種多角度分類分離出來,讓它們獨立變化,減少它們之間耦合。
-
關鍵代碼
抽象類依賴實作類。
- 應用執行個體
- 牆上的開關,可以看到的開關是抽象的,不用管裡面具體怎麼實作的。
- 優點
- 抽象和實作的分離。
- 優秀的擴充能力。
- 實作細節對客戶透明。
-
缺點
橋接模式的引入會增加系統的了解與設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與程式設計。
- 使用場景
- 如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜态的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。
- 對于那些不希望使用繼承或因為多層次繼承導緻系統類的個數急劇增加的系統,橋接模式尤為适用。
- 一個類存在兩個獨立變化的次元,且這兩個次元都需要進行擴充。
-
注意事項
對于兩個獨立變化的次元,使用橋接模式再适合不過了。
實作
-
橋接模式主要包含如下幾個角色:
Abstraction:抽象類。
RefinedAbstraction:擴充抽象類。
Implementor:實作類接口。
ConcreteImplementor:具體實作類 。
- step 1 形狀類:該類為一個抽象類,主要提供畫形狀的方法:
Abstraction
public abstract class Shape {
Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
- step 2 三個形狀 。
RefinedAbstraction
圓形:
Circle.java
public class Circle extends Shape{
public void draw() {
color.bepaint("正方形");
}
}
長方形:
Rectangle.java
public class Rectangle extends Shape{
public void draw() {
color.bepaint("長方形");
}
}
正方形:
Square.java
public class Square extends Shape{
public void draw() {
color.bepaint("正方形");
}
}
- step 3 顔色接口。
Implementor
public interface Color {
public void bepaint(String shape);
}
- step 4 三個顔色實作類。
ConcreteImplementor
白色:
White.java
public class White implements Color{
public void bepaint(String shape) {
System.out.println("白色的" + shape);
}
}
灰色:
Gray.java
public class Gray implements Color{
public void bepaint(String shape) {
System.out.println("灰色的" + shape);
}
}
黑色:
Black.java
public class Black implements Color{
public void bepaint(String shape) {
System.out.println("黑色的" + shape);
}
}
- step 4 用戶端。
Client
public class Client {
public static void main(String[] args) {
//白色
Color white = new White();
//正方形
Shape square = new Square();
//白色的正方形
square.setColor(white);
square.draw();
//長方形
Shape rectange = new Rectangle();
rectange.setColor(white);
rectange.draw();
}
}
- step 5 運作結果
白色的正方形
白色的長方形