一、引入

现需要提供能够绘制4种不同颜色且笔画粗细有大中小3种型号的画笔。

方法一:蜡笔

我们需要准备3*4=12支蜡笔,也就是说必须准备12个具体的蜡笔类

方法二:毛笔

只需要准备三种型号的毛笔,外加四个颜料盒,用3+4=7个类就可以实现12支蜡笔的功能

二、定义

桥接模式的定义:将抽象与实现分离,使它们可以独立变化。它是用关联关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

三、实现

基础实现

//实现化角色
interface Implementor
{public void OperationImpl();
}
//具体实现化角色
class ConcreteImplementorA implements Implementor
{public void OperationImpl(){System.out.println("具体实现化(Concrete Implementor)角色被访问" );}
//抽象化角色
abstract class Abstraction
{protected Implementor imple;protected Abstraction(Implementor imple){this.imple=imple;}public abstract void Operation();
}
//扩展抽象化角色
class RefinedAbstraction extends Abstraction
{protected RefinedAbstraction(Implementor imple){super(imple);}public void Operation(){System.out.println("扩展抽象化(Refined Abstraction)角色被访问" );imple.OperationImpl();}
}
//测试类
public class BridgeTest
{public static void main(String[] args){Implementor imple=new ConcreteImplementorA();Abstraction abs=new RefinedAbstraction(imple);abs.Operation();}
}
//测试结果
扩展抽象化(Refined Abstraction)角色被访问
具体实现化(Concrete Implementor)角色被访问

画笔实现

四、优缺点

优点:

  • 分离抽象接口及其实现部分。

  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。

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

  • 实现细节对客户透明。

缺点:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

五、使用场景

  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

六、典型应用

JDBC

String sql = "具体要操作的sql语句";
// 1:装载驱动
Class.forName("驱动的名字");
// 2:创建连接 Connection conn = DriverManager.getConnection("连接数据库服务的URL", "用户名","密码");  // 3:创建statement或者是preparedStatement
PreparedStatement pstmt = conn.prepareStatement(sql);
// 4:执行sql,如果是查询,再获取ResultSet
ResultSet rs = pstmt.executeQuery(sql);  // 5:循环从ResultSet中把值取出来,封装到数据对象中去
while (rs.next()) {  // 取值示意,按名称取值  String uuid = rs.getString("uuid");  // 取值示意,按索引取值  int age = rs.getInt(2);
}
//6:关闭
rs.close();
pstmt.close();
conn.close();

我们写的应用程序,是面向JDBC的API在开发,这些接口就相当于桥接模式中的抽象部分的接口。JDBC的驱动程序实现了JDBC的API,驱动程序就相当于桥接模式中的具体实现部分。DriverManager来把它们桥接起来,从某个侧面来看,DriverManager在这里起到了类似于简单工厂的功能。

该例子详情可见:https://www.jianshu.com/p/af6b1b27f638
介绍了广义桥接模式和更多其他模式对比

七、对比

策略模式

相同点:

  • 在桥接模式中,Abstraction通过聚合的方式引用Implementor。
    在策略模式中,Context也使用聚合的方式引用Startegy抽象接口。
  • 在这两种模式中,都存在一个对象使用聚合的方式引用另一个对象的抽象接口的情况,而且该抽象接口的实现可以有多种并且可以替换。可以说两者在表象上都是调用者与被调用者之间的解耦,以及抽象接口与实现的分离。

不同点:

  • 在形式上,在桥接模式中不仅Implementor具有变化(ConcreateImplementior),而且Abstraction也可以发生变化(RefinedAbstraction),且两者的变化是完全独立的,RefinedAbstraction与ConcreateImplementior之间松散耦合,它们仅仅通过Abstraction与Implementor之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性。

  • 在语意上,桥接模式强调Implementor接口仅提供基本操作,而Abstraction则基于这些基本操作定义更高层次的操作。而策略模式强调Strategy抽象接口的提供的是一种算法,一般是无状态、无数据的,而Context则简单调用这些算法完成其操作。

适配器模式

相同点:

  • 让两个东西配合工作,且和对象适配器模式一样,都存在一个类调用另一个类。

不同点:

  • 假如A适配B(只针对对象的适配器),以及A桥接B
  • 时机:适配是在A,B都早已实现的情况下,而桥接反之,设计之初就要考虑
  • 动机:适配是A为了满足B接口的需求封装自己迎合B,桥接是AB两个维度共同组合成一个实体。

装饰器模式

相同点:

  • 使得两者可以独立变化。可以减少派生类的增长

不同点:

  • 装饰是实现与实现之间的动态组合
  • 桥接是抽象与实现的分离

GOF设计模式之桥接模式相关推荐

  1. C++设计模式之桥接模式

    这篇文章主要介绍了C++设计模式之桥接模式,本文讲解了什么是桥接模式.为什么要使用桥接模式.什么时候使用桥接模式等内容,需要的朋友可以参考下 问题描述 现在要去画一个图形,图形有长方形.圆形和扇形等等 ...

  2. 详解设计模式:桥接模式

    桥接模式(Bridge Pattern)也称为桥梁模式.接口模式或者柄体模式,有点像适配器模式,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 桥接模式 是用于把抽象化与实现化解耦,使得二 ...

  3. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

  4. php设计模式之桥接模式

    php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...

  5. java 懒加载模式_JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

    我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Jav ...

  6. 设计模式之桥接模式详解

    设计模式之桥接模式详解 文章目录 设计模式之桥接模式详解 一.什么是桥接模式 二.桥接模式的应用场景 三.桥接模式的角色组成 四.桥接模式通用写法示例 五.桥接模式优缺点 一.什么是桥接模式 桥接模式 ...

  7. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  8. java 设计模式之桥接模式,策略模式

    java 设计模式之桥接模式,策略模式 1.引出设计模式 相信大家都玩过王者荣耀这款游戏.我们知道现在大概有九十多个英雄且各自技能及背景故事.台词.被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化 ...

  9. 《设计模式》桥接模式

    <设计模式>设计模式的基本原则 <设计模式>单例模式 <设计模式>工厂模式 <设计模式>原型模式 <设计模式>建造者模式 <设计模式& ...

最新文章

  1. Blender车辆绑定动画制作视频教程
  2. 你有没有试过“闭上眼”使用:京东、滴滴、QQ、支付宝?
  3. struts2 action之间参数的传递
  4. matlab、python使用小方法收集
  5. mysql 优惠卷表设计_这些年MySQL表设计踩过的坑!
  6. tampermonkey怎么不能用了_发现键盘数字小键盘不能用怎么办?
  7. Marketing Cloud的contact merge机制
  8. [Android] android:visibility属性应用
  9. win11 P85主板能正常安装吗 windows11使用p85主板的安装的步骤方法
  10. mysql如何判断是否有这个字段_判断字段是否是纯数字
  11. ubuntu上下左右变成BD
  12. 卡尔曼滤波器原理简介
  13. 计算机表格常用公式,十个办公常用的最基本的Excel函数
  14. 量化交易:金融算法交易的前沿发展
  15. hdf heg 批量拼接_MODIS数据处理新工具(HDF-EOS To GeoTIFF Conversion Tool,HEG_2.15)官方使用说明...
  16. 攻防世界-MISC-互相伤害
  17. 教你玩转 sqlplus,工作效率提升 200%
  18. numpy matplotlib 进行图像读取和显示
  19. “十月围城”中国高校SAS数据分析大赛将再燃战火
  20. 877E - Danil and a Part-time Job

热门文章

  1. 线程池参数到底要怎么配?
  2. Java面试——SpringMVC系列总结
  3. SpringBoot设置首页(默认页)跳转
  4. java打印两个小人_[原创]Java画小人与阶梯问题的解答
  5. 多媒体计算机技术19秋作业1,东师多媒体计算机技术19春在线作业1【标准答案】.doc...
  6. MySQL MVCC 概述
  7. 计算机主机声音怎么办,电脑主机声音大怎么解决 电脑主机嗡嗡响是怎么回事...
  8. java 反射 内存_Java 反射
  9. opengl实现三维动画简单代码_使用Python简单实现马赛克拼图!内附完整代码
  10. LeetCode算法入门- Longest Common Prefix -day13