陈巧倩

设计模式-桥接模式

· 285 words · 2 minutes to read
Categories: CSharp
Tags: Design Pattern

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();

结论 🔗

搬砖愉快!