設計模式- 橋接模式

  • 為什么需要橋接模式?
    對象的關系是在編譯時就定義好了,所以無法再運行時改變從父類繼承的實現。子類的實現與它的父類有非常緊密的依賴關系,以至于父類實現中的任何變化必然會導致子類發生變化,當你需要復用子類時,如果繼承下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關系限制了靈活性并最終限制了復用性。

  • 合成/聚合復用原則
    盡量使用合成/聚合,盡量不要使用類繼承。

    • 聚合:聚合表示一種弱的“擁有”關系,體現的是 A 對象可以包含 B 對象,但B 對象不是 A 對象的一部分。
    • 合成,強的‘擁有‘關系,體現了嚴格的部分和整體的關系,部分和整體的聲明周期是一樣。
  • 舉例

    • 問題:
      手機品牌:手機品牌 A,手機品牌 B。
      手機軟件:游戲 ,通訊錄。
      現在想要在兩個手機上分別安裝游戲和通訊錄。
    • 分析:手機品牌作為抽象類 A,軟件做為抽象類 B,手機品牌和手機軟件之間屬于聚合關系,手機品牌包含手機軟件,但是手機軟件并不屬于手機品牌。


      橋接.png
  • 橋接模式
    橋接模式,將抽象部分與它的實現部分分離,使它們都可以獨立的變化。
    抽象與實現分離是指抽象類和它的派生類用來實現自己的對象。讓手機既可以按照品牌來分類也可以按照功能來分分類。


    屏幕快照 2016-08-28 下午1.57.08.png
  • 代碼實現

abstract class Implementor
{
    public abstract void Operation();
}
class ConcreteImplentorA:Implementor
{
    public override void Operation()
    {
        Console.WriteLine("A 方法執行");
    }
}
class ConcreteImplentorB:Implementor
{

    public override void Operation()
    {
        Console.WriteLine("B 方法執行");
    }
}
class Abstraction
{
    protected Implementor implementor;
    public void SetImplementor(Implementor implementor)
    {
        this.implementor = implementor;
    }
    public virtual void Operation()
    {
        implementor.Operation();
    }
}
class RefinedAbstraction:Abstraction
{
    public override void Operation()
    {
        implementor.Operation();
    }
}
//客戶端實現
static void Main(string[] args){
    Abstraction ab = new Abstraction();
    ab.Operation();
    ab.SetImplementor(new ConcreteImplentorA);
    ab.Operation();
    ab.SetImplementor(new ConcreteImplentorB);
    ab.Operation();
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容