GOF设计模式之桥接模式

一、引入

现需要提供能够绘制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两个维度共同组合成一个实体。

装饰器模式

相同点:

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

不同点:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

antd 设置表头属性_使用表数据自定义React Antd表头

In my React project, I need to customize antd table header as followsI have added sample code bellow.I need to have Sum of the amount in the header of the Amount columnSample Code:解决方案You can use title function like this for get total of amount fieldsc…

c6x Linux 内核中断分析

1. 内核中断介绍 1.1 中断简介 所有支持Linux的平台都采用了中断(interrupt)的概念,以便(因种种原因)引入周期性的中断。需要区分两种类型的中断。 1. 硬件中断(hardware interrupt)&#xff1a…

ccf 智能运维 裴丹_智能运维 聊一聊实时计算系统

本文是我在实时数据计算系统的设计、开发、运维生涯的一部分经验总结。主要介绍一些设计思路和常见问题的解决方案,不关注具体计算框架的使用。本人主要致力于监控系统数据计算方向,主要业务场景有:监控数据的ETL、数据汇聚、分析、异常检测等…

系统建模、分析、仿真和验证软件工具ModelCodoer

在安全关键领域,基于模型的软件工程已逐渐进入了我国的装备研制过程中。使用SimuLink或者SCADE等嵌入式软件建模工具进行可视化建模,然后生成高可靠的二进制代码逐渐成为了安全关键领域的主流软件开发方式。由迪捷软件自主研发的系统建模、分析、仿真和验…

php配置email支持_使用PHPMailer实现PHP发邮件功能

第一步:打开网址https://github.com/PHPMailer/PHPMailer/ 下载PHPMailer,PHPMailer 需要 PHP 的 sockets 扩展支持,而登录 QQ 邮箱 SMTP 服务器则必须通过 SSL 加密的, PHP 还得包含 openssl 的支持。第二步:使用 php…

如何构建裸机hello world目标程序并在SkyEye全数字实时仿真平台上运行及调试?

SkyEye全数字实时仿真平台,简称SkyEye,是一款支持 ARM、TI DSP、PowerPC、X86、SPARC、龙芯、飞腾等多种处理器体系架构的指令级仿真平台。 SkyEye可以部署在桌面计算机上,开发人员可以基于SkyEye提供的已有模型库的组件(如处理器…

bigdicmal除法精度设置_BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题

java保留两位小数问题:方式一:四舍五入double f 111231.5585;BigDecimal b new BigDecimal(f);double f1 b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();保留两位小数---------------------------------------------…

「基于模型的系统工程」的发展历程

节选自《「基于模型的系统工程」的发展历程》,因篇幅有限,完整报告文末领取。 当下,人们热衷于讨论基于计算机的建模、模型、数据库和敏捷设计方法。然而,很少有人会耐心地审视和理解大量的技术创新,这些技术创新和发…

Unity使用Rider作为默认编辑器

01.Edit -> Preferences 02.Externel Tools -> Open by file extension 如果界面选项有Rider直接选择,如果没有选择Browse) 03.选择rider64.exe 04.成功关联

群签名和环签名的区别_环签名方案的研究

摘要:信息时代虽然带给我们无限商机与方便,但也充斥着隐患与危险.由于网络容易受到攻击,导致机密信息的泄密,数据被篡改,轻则引发企业,部门工作陷入瘫痪,个人利益受损,重则危及国家安全和社会稳定,因此保证信息安全已经成为关系国计民生的重要问题之一.而数字签名技…

国产自主可控的代码自动生成工具SkyEye

传统的系统开发过程,都是由工程师根据项目需求书来编写代码完成系统的开发,但随着功能的扩充和版本的迭代,系统中庞大的代码量很难确保正确无误,给后期测试和仿真带来了很大的压力和成本,在航空航天、卫星系统、核电等…

同步数据流语言代码生成工具的研究进展

摘要 同步数据流语言(如Lustre,Signal)近年来在航空、高铁、核电等安全关键领域得到了广泛应用,因此与这类语言相关的开发工具本身的安全性问题受到高度关注.同步数据流语言到串行命令式语言的代码生成工具是此类工具的典型代表(如Scade)。构造代码生成工具的途径可…

jstack 脚本 自动日志_深入理解jstack日志

Tags : jstack日志发表时间:2019-03-17 23:53:19在分析线上问题时常使用到jstack 命令将当时Java应用程序的线程堆栈dump出来。面对jstack 日志,我们如何查看?首先要清楚线程的状态线程的状态有:new、runnable、running、waiting、…

swagger默认访问路径_swagger 如何配置项目访问路径

boot子模块的pom文件:xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">swagger-parentcom.test.swagger1.0-SNAPSHOT4.0.0warbo…

layui向body添加html_layui 各项配置

第一、如何全部选中table中每一条记录1.首先给table的父类设置一个唯一id *这种方式不推荐,效果比较差,推荐第2种方式再搜索 alias-table div.layui-table-fixed.layui-table-fixed-l下面的i元素var bbcc $(#alias-table div.layui-table-fixed.layui-ta…

国产自主可控的MBSE解决方案和全数字仿真平台(SkyEye)

2020年6月,哈工大、哈工程被美国商务部列入实体清单,禁用MATLAB事件频繁登上热搜,工业软件被称为「卡脖子」技术。 截止到2020年12月,中国已有超过300家企业和机构被列入美国“实体名单”,被列入名单的大部分是从事安全…

iservice封装有哪些方法_总结WebService的一些封装技巧

今天早上起来,想谈谈.NET中的WebService,当然我不想讲什么是WebService,或者怎么用WebService,因为那个大家随便Google一下前100页都能找到答案。今天我想来分享一下我在用WebService中的一些技巧(至少我认为是技巧,还…

一种全数字实时仿真的安全关键领域解决方案

随着科技的发展,系统工程的设计体量逐渐庞大起来,尤其是对于轨道交通、航空航天、核电站等安全关键领域中,如何在复杂度逐年变大的同时保证其安全性和可靠性,是近年来各大公司需要研究的课题。最近比较火热的基于模型的系统工程&a…

vue 引用网络css_vue如何引用其他组件(css和js)

1.vuejs组件之间的调用components注意:报错Do not use built-in or reserved HTML elements as component id:修改组件的名字,例如不能使用address为组件名字组件名字不要使用内置的或保留HTML元素为组件id,App.vue是一个入口,vue…

国产自主可控的MBSE建模与仿真平台SkyEye

转载: 2020年6月,哈工大、哈工程被美国商务部列入实体清单,禁用MATLAB事件频繁登上热搜,工业软件被称为「卡脖子」技术。 截止到2020年12月,中国已有超过300家企业和机构被列入美国“实体名单”,被列入名…