(精華)2020年8月28日 二十三種設計模式(七)-橋接模式(Bridge Pattern)

愚公搬程式碼發表於2020-08-13

橋接模式(Bridge Pattern)

橋接模式屬於結構型模式,它將抽象部分與它的實現部分分離,使它們都可以相互獨立地變化。

利用面嚮物件的技術來使得某型別能夠輕鬆的沿著多個方向進行變化,而又不引入額外的複雜度,這就是橋接模式的核心意義。

角色

1、抽象(Abstraction)

定義抽象介面,該介面中包含實現具體行為、具體特徵的Implementor介面;

2、擴充抽象(Refined Abstraction)

繼承自Abstraction的子類,依舊是一個抽象的事物名;

3、實現(Implementor)

定義具體行為,具體特徵的應用介面;

4、具體實現(ConcreteImplementor)

Implementor的具體實現。

示例

在這裡插入圖片描述
名稱空間BridgePattern中包含電視機基類,3個具體電視機類,一個遙控器基類和1個具體遙控器類。本案例嘗試使用橋接模式來解決如何用遙控器來遙控不同的電視機完成相應的動作。

public abstract class Television {

    public abstract void TurnOn();

    public abstract void TurnOff();

    public abstract void TurnChannel();

}

電視機基Television類,包含開啟電視TurnOn、關閉電視TurnOff、換臺功能TurnChannel。

public class Konka : Television {

    public override void TurnOn() {
        Console.WriteLine("Turn on Konka!");
    }

    public override void TurnOff() {
        Console.WriteLine("Turn off Konka!");
    }

    public override void TurnChannel() {
        Console.WriteLine("Turn channel Konka!");
    }

}

具體電視類,康佳Konka類。

public class Lenovo : Television {

    public override void TurnOn() {
        Console.WriteLine("Turn on Lenovo!");
    }

    public override void TurnOff() {
        Console.WriteLine("Turn off Lenovo!");
    }

    public override void TurnChannel() {
        Console.WriteLine("Turn channel Lenovo!");
    }

}

具體電視類,聯想Lenovo類。

public class Panasonic : Television {

    public override void TurnOn() {
        Console.WriteLine("Turn on Panasonic!");
    }

    public override void TurnOff() {
        Console.WriteLine("Turn off Panasonic!");
    }

    public override void TurnChannel() {
        Console.WriteLine("Turn channel Panasonic!");
    }

}

具體電視類,松下Panasonic類。

public class TeleControllerBase {

    public Television Television { get; set; }

    public virtual void TurnOn() {
        Television.TurnOn();
    }

    public virtual void TurnOff() {
        Television.TurnOff();
    }

    public virtual void TurnChannel() {
        Television.TurnChannel();
    }

}

遙控器基類TeleControllerBase類,內部維持一個電視機基類的引用,幷包含對應的3個電視機功能。

public class TeleController : TeleControllerBase {

    public override void TurnOff() {
        base.TurnOff();
        Console.WriteLine("-------------------------");
    }

}

具體遙控器TeleController類。

public class Program {

    private static TeleControllerBase _teleController = null;

    public static void Main(string[] args) {
        _teleController = new TeleController();

        _teleController.Television = new Konka();
        _teleController.TurnOn();
        _teleController.TurnChannel();
        _teleController.TurnOff();

        _teleController.Television = new Lenovo();
        _teleController.TurnOn();
        _teleController.TurnChannel();
        _teleController.TurnOff();

        _teleController.Television = new Panasonic();
        _teleController.TurnOn();
        _teleController.TurnChannel();
        _teleController.TurnOff();

        Console.ReadKey();
    }

}

以上是呼叫方的程式碼,以下是這個案例的輸出結果:

Turn on Konka!
Turn channel Konka!
Turn off Konka!
-------------------------
Turn on Lenovo!
Turn channel Lenovo!
Turn off Lenovo!
-------------------------
Turn on Panasonic!
Turn channel Panasonic!
Turn off Panasonic!
-------------------------

優點

1、抽象和實現的分離;
2、優秀的擴充套件能力;
3、實現細節對客戶透明。

缺點

1、橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與程式設計。

使用場景

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

相關文章