1. 程式人生 > 其它 >Java 設計模式之橋接模式,Java 橋接模式 ,java Bridge Pattern

Java 設計模式之橋接模式,Java 橋接模式 ,java Bridge Pattern

Java 設計模式之橋接模式

Java 橋接模式

java Bridge Pattern

================================

©Copyright 蕃薯耀2021-07-05

https://www.cnblogs.com/fanshuyao/

一、橋接模式(Bridge Pattern)

橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種型別的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。
這種模式涉及到一個作為橋接的介面,使得實體類的功能獨立於介面實現類。這兩種型別的類可被結構化改變而互不影響。

意圖:將抽象部分與實現部分分離,使它們都可以獨立的變化。
主要解決:在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴充套件起來不靈活。
何時使用:實現系統可能有多個角度分類,每一種角度都可能變化。
如何解決:把這種多角度分類分離出來,讓它們獨立變化,減少它們之間耦合。

優點: 1、抽象和實現的分離。 2、優秀的擴充套件能力。 3、實現細節對客戶透明。
缺點:橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與程式設計。

使用場景:
1、如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯絡,通過橋接模式可以使它們在抽象層建立一個關聯關係。
2、對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。
3、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件。

所以,對於兩個獨立變化的維度,使用橋接模式再適合不過了。

二、橋接模式程式碼示例

以用什麼顏色畫什麼形狀為例,顏色可以是紅色、藍色……,形狀可以是正方形、圓形……,顏色和形狀就是兩個獨立維度,適合採用橋接模式。

1、顏色介面

public interface Color {

    public void draw(String shape);
}

2、紅色顏色

public class ColorRed implements Color {

    @Override
    public void draw(String shape) {
        System.out.println("用紅色畫" + shape);
    }

}

3、藍色顏色

public class ColorBlue implements Color {

    @Override
    public void draw(String shape) {
        System.out.println("用藍色畫" + shape);
    }

}

4、形狀(抽象類)

/**
 * 抽象類,最重要的類
 *
 */
public abstract class Shape {

    /**
     * 使用protected修飾物件
     */
    protected Color color;

    
    /**
     * 宣告構造方法,方便注入color
     * @param color
     */
    public Shape(Color color) {
        this.color = color;
    }
    
    
    /**
     * 宣告抽象方法,子類實現
     */
    protected abstract void drawShape();
    
    
}

5、正方形

/**
 *  正方形
 *
 */
public class ShapeSquare extends Shape {

    /**
     * 此處也很重要
     * @param color
     */
    public ShapeSquare(Color color) {
        super(color);
    }

    @Override
    protected void drawShape() {
        color.draw("正方形");
    }

}

6、圓形

/**
 * 圓形
 *
 */
public class ShapeCircle extends Shape {

    /**
     * 此處很重要,需要呼叫super(color)
     * @param color
     */
    public ShapeCircle(Color color) {
        super(color);
    }

    @Override
    protected void drawShape() {
        color.draw("圓形");
    }

}

7、客戶端(測試)

public class Client {

    public static void main(String[] args) {

        //正方形 - Red
        Shape shapeRed = new ShapeSquare(new ColorRed());
        shapeRed.drawShape();
        
        
        //圓形 - Blue
        Shape shapeBlue = new ShapeCircle(new ColorBlue());
        shapeBlue.drawShape();
    }

}

測試結果:

用紅色畫正方形
用藍色畫圓形

(時間寶貴,分享不易,捐贈回饋,^_^)

================================

©Copyright 蕃薯耀2021-07-05

https://www.cnblogs.com/fanshuyao/

今天越懶,明天要做的事越多。