设计模式-桥接模式

简介

  • 桥接模式 (Bridge Pattern)是一种结构型设计模式,其目的是将抽象部分与其实现部分分离,使它们可以独立地变化。在 JavaScript 中,桥接模式通过组合而非继承来实现这一目标,这有助于减少类之间的耦合,并提高代码的可扩展性

桥接模式的基本构成

  • 桥接模式通常涉及以下两个方面:

    • 抽象部分(Abstraction) :这部分定义了抽象类的接口。它持有一个对实现部分对象的引用,所有对这个类的请求都会转发给这个实现部分。
    • 实现部分(Implementor) :这是一个接口或抽象类,定义了实际操作的接口。不同的具体实现类将按照这个接口实现具体操作。

    这种分离的好处是,抽象部分可以不受实现部分的影响地发展,反之亦然。这样,系统中的任何一方都可以独立地更改或扩展,而不会影响另一方。

示例:渲染器和形状

  • 假设我们需要开发一个图形库,可以渲染不同形状,如圆形和方形。同时,支持不同的渲染方式,如矢量渲染和光栅渲染。

    Implementor - 渲染器接口(Renderer):

    javascript 复制代码
    class Renderer {
      renderCircle(radius) {}
      renderSquare(side) {}
    }

    具体实现类 - 矢量渲染器和光栅渲染器:

    javascript 复制代码
    class VectorRenderer extends Renderer {
      renderCircle(radius) {
        console.log(`Drawing a circle of radius ${radius} with vector renderer`);
      }
    
      renderSquare(side) {
        console.log(`Drawing a square of side ${side} with vector renderer`);
      }
    }
    
    class RasterRenderer extends Renderer {
      renderCircle(radius) {
        console.log(`Drawing pixels for a circle of radius ${radius} with raster renderer`);
      }
    
      renderSquare(side) {
        console.log(`Drawing pixels for a square of side ${side} with raster renderer`);
      }
    }

    Abstraction - 形状:

    javascript 复制代码
    class Shape {
      constructor(renderer) {
        this.renderer = renderer;
      }
    
      draw() {}
      resize() {}
    }

    具体的形状类 - 圆形和方形:

    javascript 复制代码
    class Circle extends Shape {
      constructor(renderer, radius) {
        super(renderer);
        this.radius = radius;
      }
    
      draw() {
        this.renderer.renderCircle(this.radius);
      }
    
      resize(factor) {
        this.radius *= factor;
      }
    }
    
    class Square extends Shape {
      constructor(renderer, side) {
        super(renderer);
        this.side = side;
      }
    
      draw() {
        this.renderer.renderSquare(this.side);
      }
    }

    使用桥接模式:

    javascript 复制代码
    const vectorRenderer = new VectorRenderer();
    const rasterRenderer = new RasterRenderer();
    
    const circle = new Circle(vectorRenderer, 5);
    circle.draw();  // 输出:Drawing a circle of radius 5 with vector renderer
    
    const square = new Square(rasterRenderer, 4);
    square.draw();  // 输出:Drawing pixels for a square of side 4 with raster renderer

优点和适用场景

  • 优点:

    • 分离抽象和实现:使得抽象部分和实现部分可以独立地变化和扩展。
    • 减少类的数量:避免在每个实现需要不同抽象的情况下的类爆炸问题。
    • 提高扩展性:可以独立地增加新的抽象部分和实现部分,而不会影响到其他代码。
  • 适用场景:

    • 当你想避免抽象部分和具体实现部分之间的永久绑定时。
    • 当两个维度的变化都很可能时,使用桥接模式可以独立地进行扩展,而不是通过继承来增加子类的数量。
    • 当需要跨多个平台运行时,其实现细节可能会有所不同,桥接模式可以帮助将平台独立的代码与平台相关的代码分离开来。

总结

  • 在 JavaScript 中,桥接模式通过将抽象部分和实现部分分离,有助于管理和最小化各个类的复杂性。这种模式特别适合于那些可能需要在多个维度上变化的系统设计,例如图形渲染示例中的不同形状与不同渲染技术。通过使用桥接模式,可以灵活地组合不同的抽象和实现,从而提供更加动态的系统架构。
相关推荐
丶白泽32 分钟前
重修设计模式-设计原则
设计模式·接口隔离原则·依赖倒置原则·开闭原则
【D'accumulation】35 分钟前
典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
java·设计模式·mvc
仙魁XAN2 小时前
Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
unity·设计模式·工厂方法模式·抽象工厂模式
龙哥·三年风水12 小时前
活动系统开发之采用设计模式与非设计模式的区别-后台功能总结
设计模式·php·tinkphp6
一头老羊13 小时前
前端常用的设计模式
设计模式
严文文-Chris13 小时前
【设计模式-组合】
设计模式
kimloner14 小时前
工厂模式(二):工厂方法模式
java·设计模式·工厂方法模式
学步_技术15 小时前
Python编码系列—Python桥接模式:连接抽象与实现的桥梁
开发语言·python·桥接模式
丶白泽17 小时前
重修设计模式-结构型-桥接模式
java·设计模式·桥接模式
南郁18 小时前
把设计模式用起来!(3)用不好模式?之时机不对
设计模式