编辑
2025-09-28
C#
00

目录

摘要
正文
应用场景
优势与劣势
优势
劣势
示例
示例 1:设备和遥控器

摘要

桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使它们可以独立地变化。通过这种方式,桥接模式通过组合的方式建立两个独立变化的维度,一个维度为抽象层(Abstraction),另一个维度为实现层(Implementation),从而减少它们之间的耦合。

在传统的继承机制中,抽象和实现通常是通过继承关系来耦合的,这样的设计难以应对变化,因为一旦抽象部分需要更改,它的实现部分也必须更改,反之亦然。桥接模式通过引入一个抽象层来管理实现层的引用,从而使得抽象和实现可以独立地进行扩展。

正文

应用场景

桥接模式适用于以下场景:

  • 当你想要避免一个抽象有多个维度的实现时,例如不同的界面(UI)和不同的业务规则。
  • 当你需要在运行时切换不同的实现方式时。
  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。

优势与劣势

优势

  • 分离接口及其实现部分:提供了系统的灵活性,允许独立地管理抽象层和实现层。
  • 扩展性强:不论是抽象层还是实现层,都可以独立地进行扩展而不影响对方。
  • 符合开闭原则:可以独立地对抽象和实现进行扩展,而不是通过继承来增加功能,这符合开闭原则。
  • 隐藏实现细节:用户只与抽象层交互,不需要关心实现细节。

劣势

  • 增加复杂性:设计和代码的复杂性增加,因为需要引入更多的接口和类。
  • 理解难度:对于初学者来说,桥接模式的概念可能比较难以理解。

示例

示例 1:设备和遥控器

考虑一个遥控器和设备的例子。设备可能是电视、空调等,遥控器可以是基本遥控器或高级遥控器。不同类型的遥控器可能具有不同的功能。

C#
// 实现部分:设备接口 public interface IDevice { void PowerOn(); void PowerOff(); void ChangeChannel(int channel); }
C#
// 抽象部分:遥控器 public abstract class RemoteControl { protected IDevice device; protected RemoteControl(IDevice device) { this.device = device; } public abstract void TurnOn(); public abstract void TurnOff(); public abstract void SetChannel(int channel); }
C#
// 具体实现:电视 public class Tv : IDevice { public void PowerOn() => Console.WriteLine("电视已开启。"); public void PowerOff() => Console.WriteLine("电视已关闭。"); public void ChangeChannel(int channel) => Console.WriteLine($"电视换到频道 {channel}。"); }
C#
// 具体实现:空调 public class AirConditioner:IDevice { public void PowerOn() => Console.WriteLine("空调已开启。"); public void PowerOff() => Console.WriteLine("空调已关闭。"); public void ChangeChannel(int temperature) => Console.WriteLine($"空调温度设置为 {temperature}度。"); }
C#
// 扩展抽象:基本遥控器 public class BasicRemoteControl:RemoteControl { public BasicRemoteControl(IDevice device) : base(device) { } public override void TurnOn() => device.PowerOn(); public override void TurnOff() => device.PowerOff(); public override void SetChannel(int channel) => device.ChangeChannel(channel); }
C#
// 扩展抽象:高级遥控器 public class AdvancedRemoteControl: RemoteControl { public AdvancedRemoteControl(IDevice device) : base(device) { } public override void TurnOn() => device.PowerOn(); public override void TurnOff() => device.PowerOff(); public override void SetChannel(int channel) => device.ChangeChannel(channel); public void SetTimer(int minutes) => Console.WriteLine($"设置定时关闭为 {minutes} 分钟后。"); }
C#
static void Main(string[] args) { IDevice tv = new Tv(); RemoteControl basicRemote = new BasicRemoteControl(tv); basicRemote.TurnOn(); basicRemote.SetChannel(5); basicRemote.TurnOff(); IDevice ac = new AirConditioner(); RemoteControl advancedRemote = new AdvancedRemoteControl(ac); advancedRemote.TurnOn(); advancedRemote.SetChannel(22); // 在空调的上下文中,这可能意味着设置温度 ((AdvancedRemoteControl)advancedRemote).SetTimer(60); advancedRemote.TurnOff(); }

image.png

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!