天天看点

编程设计模式详解:什么是桥接设计模式?

作者:启辰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 设计模式的潜在好处和缺点很重要,因为它可能并不适合所有情况。 如果使用得当,桥接模式可以帮助简化复杂系统的设计和维护,使它们更灵活、更容易修改。

谢谢阅读! 如果觉得文章有帮助,可以点个赞关注一下。 这样你会收到新文章的通知。

继续阅读