【桥接设计模式详解】Java/JS/Go/Python/TS不同语言实现

简介

桥接模式(Bridge Pattern)是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,来实现二者的解耦。参与桥接的接口是稳定的,用户可以扩展和修改桥接中的类,但是不能改变接口。桥接模式通过接口继承实现或者类继承实现功能扩展。

如果你希望在几个独立维度上扩展一个类,或者你想要拆分、重组一个具有多重功能的复杂类(例如能与多个数据库服务器进行交互的类),或者你想在运行时切换不同的实现方法,可以使用桥接模式。


作用

在有多种可能会变化的情况下,用继承扩展起来不灵活,桥接可以解决类似问题。

桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。


实现步骤

定义一个工具接口,供不同工具类来实现。

建立多个具体工具类实现基础工具接口,这些工具是负责具体能力实现。

定义一个基础抽象类,里面聚合了工具接口,相当于桥接器。

建立具体对象类,继承自基础抽象类,调用工具类里的方法来实现具体功能。


UML


代码


基础抽象类

// AbstractShape.java 定义抽象桥接器,关联图形操作接口

public abstract class AbstractShape {s

  protected DrawTool drawTool;

  protected AbstractShape(DrawTool drawTool) {

      this.drawTool = drawTool;

  }

  public abstract void draw(int x, int y, int radius);

}

具体桥接器实现类

// RefinedShape.java 具体桥接类,继承抽象桥接类,扩充了自己的方法

public class RefinedShape extends AbstractShape {

  public RefinedShape(DrawTool drawTool) {

      super(drawTool);

  }

  @Override

  public void draw(int x, int y, int radius) {

      System.out.println(String.format("RefinedShape::draw() [x=%s y=%s radius=%s]", x, y, radius));

      // 通过工具类实际绘制

      drawTool.drawStyle();

  }

  // 新增的方法,可作为工具类的补充

  public void drawDone() {

      System.out.println("RefinedShape::drawDone(), 执行的drawTool是: " + drawTool.getClass().getSimpleName());

  }

}

定义工具接口类

// DrawTool.java 图形操作基础接口publicinterface DrawTool {

  publicvoid drawStyle();

}

定义工具实现类,可以多个

```java

// DrawStyleA.java 画圆A,实现了图画基础API

public class DrawStyeA implements DrawTool {

  @Override

  public void drawStyle() {

      System.out.println("DrawStyleA:drawStyle()");

  }

}

```

```java

// 画圆B,实现了图画基础API

public class DrawStyleB implements DrawTool {

  @Override

  public void drawStyle() {

      System.out.println("DrawStyleB:drawStyle()");

  }

}

测试调用

/**

    * 桥接模式是将基础抽象类作为桥接器,用来连接业务对象和具体动作,将两者充分解耦。

    * 具体对象以抽象对象为父类,实现父类方法。

    * 具体工具类实现统一的工具接口,为抽象桥接对象服务

    * 使用时,声明具体对象同时传入具体工具,使得具体对象可以使用具体工具的动作。

    */

    // 用抽象类来声明具体对象,并指定具体工具

    AbstractShape shape = new RefinedShape(new DrawStyeA());

    // 调用对象的方法,里面执行了工具类的方法

    shape.draw(10, 20, 50);

    RefinedShape shape1 = (RefinedShape) shape;

    // 类型强转为具体业务类,调用具体类的方法

    shape1.drawDone();

    // /*********************** 分割线 ******************************************/

    // 直接用具体类来声明对象,并指定另外的工具

    RefinedShape shape2 = new RefinedShape(new DrawStyleB());

    // 调用对象的方法,里面执行了工具类的方法

    shape2.draw(11, 22, 33);

    shape2.drawDone();

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容