Bridge桥接模式属于结构型设计模式,用将抽象部分与实现部分分离,使它们都可以独立地变化。
Design Pattern:Bridge 🔗
基本介绍 🔗
构成 🔗
- Abstraction:抽象角色类,定义抽象接口,并且维护(Bridge Abstraction)的引用。
- Redefined Abstraction:重新定义抽象类,继承自抽象类的类(Abstraction),并且实现抽象类定义的接口。
- Bridge:桥可以是接口,也可以是抽象类,为所有Bridge Implementations声明通用功能的接口,Abstraction使用它的引用在运行时与实现进行通信。
- Bridge Implementations:桥的具体实现。
优点 🔗
- 把抽象接口与其实现解耦。
- 抽象和实现可以独立扩展,不会影响到对方。
- 更好的贴合Open-Closed原则,可以独立开发新的抽象和实现。
缺点 🔗
- 增加了系统的复杂度。
- 采用Bridge设计模式,将功能调用请求从抽象转发给实现者,因此在系统中引入了一种间接性。
实例 🔗
C#中适配器模式的实例,代码写累了想打开电视看会电视,然后找到遥控器打开/关闭电视,由于我家里有两台分别是华为电视和小米电视,那我就使用桥接模式来实现一下。
/// <summary>
/// 桥接口
/// </summary>
public interface Bridge
{
/// <summary>
/// 打开电视
/// </summary>
void SwitchOn();
/// <summary>
/// 关闭电视
/// </summary>
void SwitchOff();
/// <summary>
/// 切换频道
/// </summary>
void SetChannel();
}
/// <summary>
/// 华为控制器部分
/// </summary>
public class HuaWeiControl : Bridge
{
public void SwitchOn()
{
Console.WriteLine("Switch On : HuaWei TV");
}
public void SwitchOff()
{
Console.WriteLine("Switch Off : HuaWei TV");
}
public void SetChannel()
{
Console.WriteLine("Set Channel : HuaWei TV");
}
}
/// <summary>
/// 小米控制器部分
/// </summary>
public class XiaoMiControl : Bridge
{
public void SwitchOn()
{
Console.WriteLine("Switch On : XiaoMi TV");
}
public void SwitchOff()
{
Console.WriteLine("Switch Off : XiaoMi TV");
}
public void SetChannel()
{
Console.WriteLine("Set Channel : XiaoMi TV");
}
}
/// <summary>
/// 遥控器抽象类
/// </summary>
public abstract class AbstractRemoteControl
{
protected readonly Bridge _bridge;
public abstract void SwitchOn();
public abstract void SwitchOff();
public abstract void SetChannel();
public AbstractRemoteControl(Bridge bridge)
{
_bridge = bridge;
}
}
/// <summary>
/// 华为遥控器
/// </summary>
public class HuaWeiRemoteControl : AbstractRemoteControl
{
public HuaWeiRemoteControl(Bridge bridge) : base(bridge)
{
}
public override void SwitchOn()
{
_bridge.SwitchOn();
}
public override void SwitchOff()
{
_bridge.SwitchOff();
}
public override void SetChannel()
{
_bridge.SetChannel();
}
}
/// <summary>
/// 小米遥控器
/// </summary>
public class XiaoMiRemoteControl : AbstractRemoteControl
{
public XiaoMiRemoteControl(Bridge bridge) : base(bridge)
{
}
public override void SwitchOn()
{
_bridge.SwitchOn();
}
public override void SwitchOff()
{
_bridge.SwitchOff();
}
public override void SetChannel()
{
_bridge.SetChannel();
}
}
实际运行:
AbstractRemoteControl huawei = new HuaWeiRemoteControl(new HuaWeiControl());
huawei.SwitchOn();
huawei.SetChannel();
huawei.SwitchOn();
AbstractRemoteControl xiaomi = new XiaoMiRemoteControl(new XiaoMiControl());
xiaomi.SwitchOn();
xiaomi.SetChannel();
xiaomi.SwitchOn();
结论 🔗
搬砖愉快!