.NET 设计模式—桥接模式(Design pattern)

简介

桥接模式(Bridge Pattern) 也称为桥梁模式、接口模式或者柄体模式,是将抽象部分与它的具体实现部分分离,使它们都可以独立地变化,属于结构型模式。桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。但又类似于多重继承方案,但是多重继承方案往往违背了类的单一职责原则,其复用性较差,桥接模式是比多重继承更好的替代方案。桥接模式的核心在于解耦抽象和实现。

在.NET中实现桥接(Bridge)设计模式通常涉及到创建一个作为抽象化(Abstraction)的类和一个实现化(Implementation)的类。抽象化类保存一个对实现化类的引用,使得抽象化和实现化可以独立变化。

角色

  • 抽象(Abstraction): 该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现,抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);
  • 修正抽象(RefinedAbstraction): Abstraction的具体实现,对Abstraction的方法进行完善和扩展;
  • 实现(Implementor): 确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或者抽象类;
  • 具体实现(ConcreteImplementor): Implementor的具体实现;

优点

  • 分离抽象与实现 : 分离抽象部分和具体实现部分 ; 桥接模式使用组合关系解耦了抽象和实现之间的继承关系 ; 抽象和实现可以各自沿着自己的维度进行扩展 ; 抽象和实现不在同一个继承层次中, 通过进行组合, 可以获得多维度的组合对象 ;
  • 提高扩展型 : 提高了系统的可扩展性 ; 解耦了抽象与实现 , 二者可以继续进行扩展 , 不需要改变系统原有的功能 ;
  • 符合开闭原则 ;
  • 符合合成复用原则 ;

缺点

  • 系统复杂 : 增加了系统的理解与设计难度 ;
  • 识别变化维度 : 需要正确地识别出系统中, 两个独立变化的维度 ;

应用场景

  • 在抽象和具体实现之间需要增加更多的灵活性的场景
  • 一个类存在两个或多个独立变化的维度,而这两个或多个维度都需要独立进行扩展
  • 不希望使用继承,或因为多层继承导致系统类的个数剧增

实现

cs 复制代码
// 实现化接口(ConcreteImplementor)
public interface ICarEngine
{
    void Start();
    void Stop();
}
 
// 具体实现化类(ConcreteImplementor)
public class GasolineEngine : ICarEngine
{
    public void Start()
    {
        Console.WriteLine("Car engine starts with a roar.");
    }
 
    public void Stop()
    {
        Console.WriteLine("Car engine stops with a halt.");
    }
}
 
// 抽象化类(Abstraction)
public abstract class Car
{
    protected ICarEngine Engine;
 
    protected Car(ICarEngine engine)
    {
        Engine = engine;
    }
 
    public virtual void Start()
    {
        Engine.Start();
    }
 
    public virtual void Stop()
    {
        Engine.Stop();
    }
}
 
// 具体抽象化类(RefinedAbstraction)
public class SportsCar : Car
{
    public SportsCar(ICarEngine engine) : base(engine)
    {
    }
 
    public override void Start()
    {
        Console.WriteLine("Sports car with turbo starts smoothly.");
        Engine.Start();
    }
 
    public override void Stop()
    {
        Console.WriteLine("Sports car with turbo stops firmly.");
        Engine.Stop();
    }
}
 
// 客户端代码
public class Program
{
    public static void Main(string[] args)
    {
        ICarEngine engine = new GasolineEngine();
        Car car = new SportsCar(engine);
 
        car.Start();
        car.Stop();
    }
}
相关推荐
触底反弹29 分钟前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
杨充21 小时前
10.可测试性实战设计
设计模式·开源·代码规范
杨充21 小时前
9.重构十二式的实战
设计模式·开源·代码规范
杨充21 小时前
6.设计原则的全景图
设计模式·开源·全栈
杨充21 小时前
2.面向对象的特性
设计模式
杨充21 小时前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充21 小时前
8.反模式与坏味道
设计模式·开源·代码规范
杨充21 小时前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法