桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使它们可以独立地变化。通过这种方式,桥接模式通过组合的方式建立两个独立变化的维度,一个维度为抽象层(Abstraction),另一个维度为实现层(Implementation),从而减少它们之间的耦合。
在传统的继承机制中,抽象和实现通常是通过继承关系来耦合的,这样的设计难以应对变化,因为一旦抽象部分需要更改,它的实现部分也必须更改,反之亦然。桥接模式通过引入一个抽象层来管理实现层的引用,从而使得抽象和实现可以独立地进行扩展。
桥接模式适用于以下场景:
考虑一个遥控器和设备的例子。设备可能是电视、空调等,遥控器可以是基本遥控器或高级遥控器。不同类型的遥控器可能具有不同的功能。
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();
}
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!