桥接模式(Bridge Pattern)

桥接模式的设计目的是不让下层的组件的变化,影响上层的调用。

桥接模式的实例

假设我有两个类,但是它们有很多不确定性,可能在后续会变修改,如下:

  1. class RedCircle {
  2. drawCircle(radius, x, y) {
  3. console.log("Drawing Circle[ color: red, radius: "
  4. + radius +", x: " +x+", "+ y +"]");
  5. }
  6. }
  7. class GreenCircle {
  8. drawCircle(radius, x, y) {
  9. console.log("Drawing Circle[ color: green, radius: "
  10. + radius +", x: " +x+", "+ y +"]");
  11. }
  12. }

虽然它们不确定性,但是对外功能还是要相对稳定。所以我们要定义抽象层Shape,和实现层Circle,保持对外暴露的方法始终是draw。

  1. class Shape {
  2. constructor(drawAPI) {
  3. if(new.target == Shape) {
  4. throw new Error('this class must be extends.')
  5. }
  6. this.drawAPI = drawAPI;
  7. }
  8. draw() {}
  9. }
  10. class Circle extends Shape {
  11. constructor(x, y, radius, drawAPI) {
  12. super(drawAPI);
  13. this.x = x;
  14. this.y = y;
  15. this.radius = radius;
  16. }
  17. draw() {
  18. this.drawAPI.drawCircle(this.radius, this.x, this.y);
  19. }
  20. }

那么在我们使用的时候无论RedCircle和GreenCircle如何变化,但是对外都是使用draw方法来调用

  1. const redCircle = new Circle(100,100, 10, new RedCircle());
  2. const greenCircle = new Circle(100,100, 10, new GreenCircle());
  3. redCircle.draw();
  4. greenCircle.draw();
  5. /**
  6. * output:
  7. * Drawing Circle[ color: red, radius: 10, x: 100, 100]
  8. * Drawing Circle[ color: green, radius: 10, x: 100, 100]
  9. */

桥接模式的优势

即使基础组件发生变化,也不影响上层的调用。例子中RedCircle和GreenCircle作为了基础组件,假设方法drawCircle进行了更名或调用方法发生变更,但是在抽象层Shape依旧是draw,只能修改Circle的draw内容来修改,但是对外依然能保持draw方法的调用。

上一页(适配器模式)

下一页(过滤器模式)