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

简介

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

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

作用

  1. 在有多种可能会变化的情况下,用继承扩展起来不灵活,桥接可以解决类似问题。
  2. 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

实现步骤

  1. 定义一个工具接口,供不同工具类来实现。
  2. 建立多个具体工具类实现基础工具接口,这些工具是负责具体能力实现。
  3. 定义一个基础抽象类,里面聚合了工具接口,相当于桥接器。
  4. 建立具体对象类,继承自基础抽象类,调用工具类里的方法来实现具体功能。

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 图形操作基础接口
public interface DrawTool {
public void 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();

更多语言版本

不同语言实现设计模式代码大全,不断更新中,敬请关注:

https://github.com/microwind/design-pattern

【桥接设计模式详解】Java/JS/Go/Python/TS不同语言实现的更多相关文章

  1. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

  2. android java 设计模式详解 Demo

    android java 设计模式详解 最近看了一篇设计模式的文章,深得体会,在此基础我将每种设计模式的案例都写成Demo的形式,方便读者研究学习, 首先先将文章分享给大家: 设计模式(Design ...

  3. Java温故而知新(5)设计模式详解(23种)

    一.设计模式的理解 刚开始“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目 ...

  4. JAVA设计模式简介及六种常见设计模式详解

    一.什么是设计模式                                                                                           ...

  5. Javascript设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  6. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  7. Javascript常用的设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  8. javascript设计模式详解之策略模式

    接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...

  9. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  10. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

随机推荐

  1. Docker info 查看报错 WARNING: No swap limit support 解决

    docker可以通过启动命令来限制容器可以使用的最大物理内存和swap,但是通常在使用这些命令的时候经常会碰到"WARNING: No swap limit support"警告 ...

  2. 循环2-if与case语法

    一.if语法结构 1. 单分支结构 if < 条件表达式 > then 指令 fi 或者 if < 条件表达式 >:then 指令 fi 2. 双分支结构 if < 条件 ...

  3. Linux基础第十一章:日志文件及如何使用rsyslog搭建小型日志服务器

    一.日志文件 1.日志作用 2.常用日志 3.日志级别 二.Rsyslog日志处理系统 1.使用Rsyslog创建日志有点 2.Rsyslog配置文件解析 3.使用rsyslog将ssh服务的日志单独 ...

  4. 手把手教你用Burpsuite+夜神模拟器抓安卓(Android 7)http+https包

    (1)进入正题,bp证书下载(下载证书至电脑):打开bp,配置好代理,浏览器访问http://127.0.0.1:8080 下载证书,记住保存路径,注意别修改证书后缀(der)!!! (2)准备一个L ...

  5. Redis Stream实现全部节点机器推送消息

    背景 有时候,在微服务时代,我们需要对全部的机器节点进行通知.在常规情况下,一个请求经过负载均衡只有一个机器可以收到.那么,如何能让全部的机器都收到同样的请求呢?需要借助消息队列的监听机制,让每个节点 ...

  6. Jmeter前置处理器和后置处理器的使用

    一.JMETER基本概念  1. 测试计划:顶级菜单,代表一个测试计划: 2. 线程组:代表一个要测试的场景(各种相关的交易集合),对于性能测试来说可以指定多少个用户完成这个场景的内容,对于自动化测试 ...

  7. go两种数据类型的区别、数据类型和操作符、常量、变量声明

    值类型和引用类型 1.值类型:变量直接存储值,内存通常在栈中分配. 基本数据类型int.float.bool.string以及数组和struct. 2.引用类型:变量存储的是一个地址,这个地址存储最终 ...

  8. SpringBoot加载相关注解

    springBoot加载 @Configuration 表明该类是一个配置类常常配合@Bean使用,让容器管理对象 @Configuration(proxyBeanMethods = true) pr ...

  9. 2月21日python程序设计

    Python变量 1.不需要事先声明变量名及其类型,直接赋值即可. 2.强类型编程语言,根据赋值或运算来推断变量类型. 3.动态类型语言,变量的类型也是可以随时变化的. >>>  x ...

  10. echarts 图表动态刷新数据

    需求:每次重新加载数据,图表柱状图从零开始加载 用 myChart.clear(); 这个方式解决. 在setOption 之前用 示例: myChart.clear(); myChart.setOp ...