首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設計模式無廢話系列(十二):Bridge 橋接模式

     編輯:關於C#

意圖

將抽象部分與實現部分分離,使兩者可獨立變化。

適用場景

網遊場景與模式雙維度擴充:場景(HalfPaper、Matrix…)、模式(戰鬥、道具、金幣…)。若用繼承,4 場景×3 模式=12 子類;10×5=50 子類。Bridge 將繼承轉為組合,乘法變加法(10+5=15)。

完整範例程式碼

using System;
using System.Collections.Generic;
using System.Text;

namespace BridgeExample
{
    class Program
    {
        static void Main(string[] args)
        {
            PatrixScene halfPaper = new HalfPaper();
            halfPaper.Mode = new GoldMode();
            halfPaper.LoadScene();
            PatrixScene matrix = new Matrix();
            matrix.Mode = new PrpoertyMode();
            matrix.LoadScene();
        }
    }
    abstract class PatrixScene
    {
        protected GameMode mode;
        public GameMode Mode { get => mode; set => mode = value; }
        public abstract void LoadScene();
    }
    class HalfPaper : PatrixScene
    {
        public override void LoadScene()
        {
            Console.WriteLine("Load HalfPaper Completed");
            mode.InitScene();
        }
    }
    class Matrix : PatrixScene
    {
        public override void LoadScene()
        {
            Console.WriteLine("Load Matrix Completed");
            mode.InitScene();
        }
    }
    abstract class GameMode
    {
        public abstract void InitScene();
    }
    class PrpoertyMode : GameMode
    {
        public override void InitScene() => Console.WriteLine("Init Property Mode Completed");
    }
    class GoldMode : GameMode
    {
        public override void InitScene() => Console.WriteLine("Init Gold Mode Completed");
    }
}

程式碼執行結果

Bridge 模式執行結果

程式碼解析

  • PatrixScene:抽象化角色(第一維度:場景)。
  • GameMode:實現化角色(第二維度:模式)。較高層作抽象化、較底層作實現化;模式為場景服務,故場景為抽象化。
  • HalfPaper/Matrix:修正抽象化角色。GOF 定義為修正父類抽象定義,實務不一定要有預設實現再修正。
  • PropertyMode/GoldMode:具體實現化角色。
  • 抽象化/實現化雙向對應:抽象化↔實現化、修正抽象化↔具體實現化。
  • 客戶端直接選擇具體實現化角色注入。與 Strategy 相似,但 Strategy 針對單維度算法替換,Bridge 處理多維度正交變化。

何時採用

  • 代碼角度:類別繼承服務於兩個目的(違反單一職責)→ Bridge 避免子類爆炸。
  • 應用角度:多維度變化,客戶端希望兩維度對象相對獨立、動態耦合(客戶端決定場景與模式如何組合)。

實作要點

  • 選擇合適類別作抽象化角色(第一維度)。
  • 抽象化與實現化以組合關聯。
  • 抽象與實現不綁定,允許客戶端切換。

注意事項

  • 無特殊注意事項。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved