天天看點

程式設計設計模式詳解:什麼是橋接設計模式?

作者:啟辰8
程式設計設計模式詳解:什麼是橋接設計模式?

橋接(Bridge)設計模式是一種結構化設計模式,将抽象與其實作分離,允許兩者獨立變化。 該模式用于将類的接口與其實作分離,使兩者可以獨立更改。 這允許更大的靈活性和代碼的重用。 它通常用于抽象及其實作需要獨立變化的情況,例如不同的作業系統或硬體平台。

想象一下,您有一輛可以用遙控器控制的玩具車。 汽車是“實作”,遙控器是“抽象”。 遙控器上有按鈕可以使汽車前進、後退、左轉和右轉。 這些按鈕是遙控器的“接口”。 現在,想象一下您想要制作一款也可以通過語音指令控制的新版玩具車。 語音指令将是新的“抽象”,而汽車仍将是“實作”。

橋接設計模式允許您将遙控器的接口與玩具車的實作分開,進而使兩者可以獨立更改。 這樣,您就可以使用相同的遙控按鈕來控制可以通過語音指令控制的新型玩具車。 這是一種使代碼更加靈活和可重用的方法。

簡而言之,橋接設計模式允許将抽象和實作分開,以便兩者可以獨立發展。 這是一種使代碼更加靈活和可重用的方法。

下面是一個用 C# 實作的 Bridge 設計模式的例子:

// 抽象類
abstract class RemoteControl
{
    protected IToy toy;

    public RemoteControl(IToy toy)
    {
        this.toy = toy;
    }

    public abstract void MoveForward();
    public abstract void MoveBackward();
    public abstract void TurnLeft();
    public abstract void TurnRight();
}

// 接口
interface IToy
{
    void MoveForward();
    void MoveBackward();
    void TurnLeft();
    void TurnRight();
}

// 具體實作
class ToyCar : IToy
{
    public void MoveForward()
    {
        Console.WriteLine("Toy car moving forward.");
    }

    public void MoveBackward()
    {
        Console.WriteLine("Toy car moving backward.");
    }

    public void TurnLeft()
    {
        Console.WriteLine("Toy car turning left.");
    }

    public void TurnRight()
    {
        Console.WriteLine("Toy car turning right.");
    }
}

// 遠端控制的具體實作
class CarRemoteControl : RemoteControl
{
    public CarRemoteControl(IToy toy) : base(toy) {}

    public override void MoveForward()
    {
        toy.MoveForward();
    }

    public override void MoveBackward()
    {
        toy.MoveBackward();
    }

    public override void TurnLeft()
    {
        toy.TurnLeft();
    }

    public override void TurnRight()
    {
        toy.TurnRight();
    }
}

// 使用
class Program
{
    static void Main(string[] args)
    {
        IToy toy = new ToyCar();
        RemoteControl remote = new CarRemoteControl(toy);
        remote.MoveForward();
        remote.MoveBackward();
        remote.TurnLeft();
        remote.TurnRight();
    }
}           

在此示例中,RemoteControl 類是抽象,IToy 接口是實作。 ToyCar類是IToy接口的具體實作,CarRemoteControl類是RemoteControl類的具體實作。 RemoteControl類和IToy接口是解耦的,這樣遙控器就可以控制任何實作了IToy接口的玩具,而玩具又可以被任何使用了RemoteControl類的遙控器控制。

以下是一些可以應用 Bridge 設計模式的真實場景:

  • GUI 工具包:GUI 工具包可以使用 Bridge 設計模式将用于建立圖形元素的界面與這些元素的實作分開,這可能因作業系統或硬體平台而異。
  • 資料庫通路:資料庫通路層可以使用橋接設計模式将通路資料庫的接口與資料庫通路的實作分開,這取決于所使用的資料庫管理系統。
  • 圖形庫:圖形庫可以使用 Bridge 設計模式将用于建立圖形的界面與圖形的實作分開,這取決于所使用的渲染技術。
  • 遊戲引擎:遊戲引擎可以使用 Bridge 設計模式将用于建立遊戲對象的界面與遊戲對象的實作分開,這可能因平台或硬體而異。
  • 支付系統:支付系統可以使用 Bridge 設計模式将處理支付的接口與支付處理的實作分開,這可能因使用的支付方式(例如支付寶、微信、PayPal等)而異。

這些隻是橋接設計模式如何在現實場景中用于建立更靈活和可重用代碼的幾個例子。

下面是一個使用 C# 橋接設計模式的支付系統示例:

// 抽象類
abstract class PaymentSystem
{
    protected IPaymentMethod paymentMethod;

    public PaymentSystem(IPaymentMethod paymentMethod)
    {
        this.paymentMethod = paymentMethod;
    }

    public abstract void MakePayment(double amount);
}

// 執行接口
interface IPaymentMethod
{
    void ProcessPayment(double amount);
}

// 支付方式的具體實作(信用卡)
class CreditCardPayment : IPaymentMethod
{
    public void ProcessPayment(double amount)
    {
        Console.WriteLine("Processing payment of #34; + amount + " using credit card.");
    }
}

// 支付方式的具體實作(PayPal)
class PayPalPayment : IPaymentMethod
{
    public void ProcessPayment(double amount)
    {
        Console.WriteLine("Processing payment of #34; + amount + " using PayPal.");
    }
}

// 支付系統的具體實作
class OnlineStorePaymentSystem : PaymentSystem
{
    public OnlineStorePaymentSystem(IPaymentMethod paymentMethod) : base(paymentMethod) { }

    public override void MakePayment(double amount)
    {
        Console.WriteLine("Making payment for online store purchase:");
        paymentMethod.ProcessPayment(amount);
    }
}

// 使用
class Program
{
    static void Main(string[] args)
    {
        IPaymentMethod creditCard = new CreditCardPayment();
        PaymentSystem onlineStore = new OnlineStorePaymentSystem(creditCard);
        onlineStore.MakePayment(100.0);

        IPaymentMethod payPal = new PayPalPayment();
        PaymentSystem onlineStore2 = new OnlineStorePaymentSystem(payPal);
        onlineStore2.MakePayment(200.0);
    }
}           

在此示例中,PaymentSystem 類是抽象,IPaymentMethod 接口是實作。 CreditCardPayment 和 PayPalPayment 類是 IPaymentMethod 接口的具體實作,而 OnlineStorePaymentSystem 類是 PaymentSystem 類的具體實作。 PaymentSystem類和IPaymentMethod接口解耦,使得支付系統可以使用任何實作IPaymentMethod接口的支付方式,該支付方式可以被任何使用PaymentSystem類的支付系統使用。

下面是一個在 C# 中使用 Bridge 設計模式的資料庫通路系統示例:

// 抽象類
abstract class DatabaseAccess
{
    protected IDatabase database;

    public DatabaseAccess(IDatabase database)
    {
        this.database = database;
    }

    public abstract void Connect();
    public abstract void ExecuteQuery(string query);
}

// 執行接口
interface IDatabase
{
    void ConnectToDatabase();
    void ExecuteSQLQuery(string query);
}

// 資料庫的具體實作(SQL Server)
class SqlServerDatabase : IDatabase
{
    public void ConnectToDatabase()
    {
        Console.WriteLine("Connecting to SQL Server database.");
    }

    public void ExecuteSQLQuery(string query)
    {
        Console.WriteLine("Executing SQL query: " + query);
    }
}

// 資料庫的具體實作(MySQL)
class MySqlDatabase : IDatabase
{
    public void ConnectToDatabase()
    {
        Console.WriteLine("Connecting to MySQL database.");
    }

    public void ExecuteSQLQuery(string query)
    {
        Console.WriteLine("Executing MySQL query: " + query);
    }
}

// 資料庫通路系統的具體實作
class ApplicationDatabaseAccess : DatabaseAccess
{
    public ApplicationDatabaseAccess(IDatabase database) : base(database) { }

    public override void Connect()
    {
        Console.WriteLine("Connecting to database for application:");
        database.ConnectToDatabase();
    }

    public override void ExecuteQuery(string query)
    {
        Console.WriteLine("Executing query for application:");
        database.ExecuteSQLQuery(query);
    }
}

// 使用
class Program
{
    static void Main(string[] args)
    {
        IDatabase sqlServer = new SqlServerDatabase();
        DatabaseAccess application = new ApplicationDatabaseAccess(sqlServer);
        application.Connect();
        application.ExecuteQuery("SELECT * FROM Customers");

        IDatabase mySql = new MySqlDatabase();
        DatabaseAccess application2 = new ApplicationDatabaseAccess(mySql);
        application2.Connect();
        application2.ExecuteQuery("SELECT * FROM Orders");
    }
}           

在此示例中,DatabaseAccess 類是抽象,IDatabase 接口是實作。 SqlServerDatabase 和 MySqlDatabase 類是 IDatabase 接口的具體實作,ApplicationDatabaseAccess 類是 DatabaseAccess 類的具體實作。 DatabaseAccess類和IDatabase接口是解耦的,這樣資料庫通路系統就可以使用任何實作了IDatabase接口的資料庫,資料庫也可以被任何使用DatabaseAccess類的資料庫通路系統使用。

缺點

橋接設計模式有以下缺點:

  1. 複雜性增加:橋接模式的使用會導緻系統整體複雜性的增加,因為它引入了額外的抽象級别。
  2. 更高的維護成本:增加的抽象會使系統更難維護和修改,因為系統的一部分發生變化可能需要系統其他部分發生變化。
  3. 性能開銷:使用橋接模式可能會導緻性能開銷,因為額外的抽象級别會引入額外的方法調用和對象執行個體化。
  4. 增加耦合:橋接模式的使用會導緻抽象和實作之間的耦合增加,因為抽象和實作必須緊密內建才能正常工作。
  5. 設計開銷:橋接模式的使用可能需要更多的設計時間和精力,因為它需要仔細考慮抽象和實作之間的關系。

在決定在項目中使用橋接設計模式之前,權衡使用橋接設計模式的潛在好處和缺點很重要,因為它可能并不适合所有情況。

結論

總之,橋接設計模式是将抽象與其實作解耦的強大工具,允許兩者獨立發展。 它為需要擴充或修改系統的情況提供了靈活且可維護的解決方案。 該模式可以應用于廣泛的問題,包括資料庫通路、支付系統和其他需要抽象和實作分離的系統。 但是,在決定在項目中使用 Bridge 設計模式之前,權衡使用 Bridge 設計模式的潛在好處和缺點很重要,因為它可能并不适合所有情況。 如果使用得當,橋接模式可以幫助簡化複雜系統的設計和維護,使它們更靈活、更容易修改。

謝謝閱讀! 如果覺得文章有幫助,可以點個贊關注一下。 這樣你會收到新文章的通知。

繼續閱讀