设计模式之Bridge Pattern

【功能安全】软件安全架构 目录01 软件安全架构介绍02 软件架构设计模板03 软件架构设计示例 软件架构设计的目的 软件架构设计的原则 软件架构设计输入与输出 软件架构设计的要求 注:软件架构设计和软件安全要求之间的双向可追溯性。软件架构设计原则: 软件架构静态/动态设计(参考秒尼科技术) 软件架构静态设计 软件架构动态设计 软件分层架构设计 软件架构设计安全机制错误探测的安全机制 其中:数据的范围检查指输入输出数据的范围进行检查,例如:在程序中我们可以通过数据范围来排除数据的正确性;合理性检查 例如:使用参 阅读详情

Design Pattern – Bridge Pattern

1      前言... 1

2      介绍... 1

3      Bridge Pattern之前... 1

4      Bridge Pattern之后... 3

5      总结... 5

 

1         前言

在网上查了一些Bridge Pattern的中文文章,感觉写的都是很笼统、很抽象,无法通过那些文章掌握Bridge的精髓。不过,在英文资料里面找到了一些可贵的观点,觉得有必要写点东西与大家分享。

 

 

2         介绍

从概念上说,Bridge Pattern就是用来把抽象和实现分离的桥模式。这样的定义在网上到处都是,概念中的抽象是什么,实现又是什么呢?可能你会说实现就是构造抽象、将它实例化、将它付诸于具体的行为。那么我会问:“到底如何将一个抽象从实现它的诸多方法中分离出来呢?”。这么看上去Bridge很想Adapter,Adapter的目的是为了是多个类的接口看起来像一个特定的类。而Bridge的目的是将实现从接口中分离,这样在替换了实现部分时不需要更改客户代码。

如果不明白没有关系,Bridge Pattern是设计模式中最难理解的模式之一,因为它的功能太过强大。

3         Bridge Pattern之前

在学习Bridge Pattern之前,我先举一个通俗的例子,这个例子可能过于简单,但是你可以把遇到的实际情况设想成与这个例子中所阐述的感念相同的情况。考虑一下两点:

Ø      在抽象层面的变化

Ø      这些变化如何去实现

在用户提出需求之后,作为一个程序设计者应当更早的去考虑“多变性”。也就是要考虑设计出的模型能否适应这种多变,如果可以说明你已经设计出了鲁棒、可扩展的模型;如果不可以就要考虑改变自己的设计。

试想我们有这么一种需求,写一个程序需要通过两种方法画图形。一种方法称之为(MT1),另一种方法叫(MT2)。需要画的图形包括线和圆。对应的两种方法如下表:

 

 

 

画线

Draw_a_line

Drawline

画园

Draw_a_circle

Drawcircle

客户不需要关心这两种方法的实现,他只需要知道使用了什么方法,所以我设计了一个Rectangle类和它的两个子类,这两个子类分别使用的不同的方法来绘制图形。如下图所示:

V1Rectangle和V2Rectangle继承自Rectangle,分别表示两种不同的版本。它们都重写了父类的drawLine()方法,在改方法中有分别使用了MT1和MT2两种绘画方法。

我使用了简单的树形结构来设计我的模型,现在需要改模型增加一种支持Circle画法。很自然的,我会用Shape类作为客户使用的对象并增加一层类图,如下所示:

 

在该图中一共有4层类,第一层是和客户打交道的Shape抽象类,客户通过它来绘制图形,具体用哪种方法客户不需要关系,全部隐藏在Shape的子类中。第二层是支持的抽象形状,它们分别有两个子类,即第三层。这层的类主要是调用了具体的画法函数(第四层)。这种设计可以通过修改第三层的代码来切换不同画法,客户不受任何影响。但是它并不是一个好的设计模型,主要有一下两点不足:

Ø      设想如果我们添加了一种新的画法(MT3),那么第三层的类会增加到6个(两中形状乘以三个方法)。

Ø      设想如果我们的模型又需要支持另一种形状,如椭圆,那么第三层的类个数会增加到9个(三种形状乘以三个方法)。

导致这种低扩展性的原因主要是因为我们没有解耦抽象与实现。他们被紧密的结合在一起。

4         Bridge Pattern之后

这里我将引出Bridge Pattern的方法,它的主要目的就是要把抽象和该抽象的诸多实现解耦。在设计第一步就要提取出需求中的抽象和实现是哪些,在我们的模型中,抽象就是形状,实现就是画法、即构造形状的方法。如下图所示:

 

 

分离出抽象和实现之后,就要建立它们之间的关系。现在有两种选择,是形状使用画法、还是画法使用形状?如下图所示:

    

     如果我认为是画法使用形状,那么画法就需要知道形状的一些细节,如它是什么,它是什么样子等。这就违背了一条原则:一个对象只需要关系与它自己相关的东西。

     再考虑形状使用画法的方式。一个形状,它不需要知道自己用了哪个画法对象,因为它只是有一个画法对象的引用。它只需调用画法函数。通过画法来构造自己。最后的类图如下所示:

这种模式分离了抽象和实现,给我们很大的自由来隐藏抽象的实现。在此基础上,如果增加了新的形状或新的画法都不会影响整个类的结构。只需要在左边(如果增加形状)或在右边(如果增加了画法)创建新的形状或画法类,让他们继承自各自的抽象类即可。

5         总结

     我秉承了“One rule,One place”原则,它是实现策略的重要原则。一旦你定义了一个规则,这需要实习它一次。这样可以避免重复代码,而且如果需要修改只该一个地方即可。上例中,Shape的draw()方法只是直接的调用了Drawing的drawLine()方法,而不论Shape保持的是哪个Drawing对象。

     在使用Bridge时,通常会结合其他的设计模式。比如上例中就结合了Adapter模式。

     个人认为,Bridge是比较复杂、功能强大的设计模式,希望大家今后在使用时逐步的发现它的功能,做出鲁棒的模式。

     此文仅代表个人观点,如有不到之处敬请谅解,有问题希望与我交流:youhaodeyi@gmail.com.

 

使用C#实现的多人语音视频系统:WebSocket与WebRTC集成 通过上述的代码示例,我们可以使用C#编写一个多人语音视频系统,该系统集成了WebSocket和WebRTC技术。当然,这只是一个简单的示例,实际的多人语音视频系统可能需要更多的功能和优化。通过结合这两种技术,我们可以实现实时的语音和视频通信,支持多人同时参与。在上述代码中,我们创建了一个WebSocket服务器,监听在本地的8080端口,并创建了一个WebRTC连接。接下来,我们将详细介绍如何使用C#编写一个多人语音视频系统,包括使用WebSocket建立连接和使用WebRTC进行实时通信。 阅读详情

相关推荐

Simulink实战:火电机组一次调频与AGC协同控制建模与仿真解析

本文详细解析了如何使用Simulink进行火电机组一次调频与AGC协调控制的建模与仿真。通过系统架构设计、参数设置和模块实现,阐述了如何实现两者的协同控制,确保电网频率稳定。文章提供了实用的建模技巧、参数整定经验和性能评估方法,为电力系统仿真工程师提供了有价值的实践指导。

c7d8e9的博客 307

Design Pattern Bridge 桥设计模式

桥设计模式其实就是一个简单的has a relationship,就是一个类拥有另一个类,并使用另一个类实现需要的功能。 比如遥控器和电视之间可以使用桥设计模式达到可以使用同一个遥控器控制多台电视机的目的。 这样的设计思想是多种设计模式反反复复使用基本思想。 仔细思考下会发现多种设计模式的底层思想其实是相通的,不过具体实现或者某些细节,应用等有那么一点差别罢了。 下面就实现一个TV和rem

靖空间 1660

全桥LLC谐振变换器变频控制工作原理与仿真

全桥LLC谐振变换器以其效率高、全范围软开关、器件电应力小等优点,越来越多地应用于大功率场合。电力电子技术的发展日益追求高频化,所带来的问题是半导体开关器件高频运行时的开关损耗急剧增加。各种软开关电路随之出现。可以有效减小开关损耗,使进一步提高开关频率成为可能。谐振式开关因其可在电流自然过零点开通半导体器件,实现零电压开关,特别适合采用MOSFET作开关的装置。最简单的谐振电路有串联谐振(SRC)和并联谐振(PRC)。SRC只能工作于降压状态,应用受限;

晞子的技术札记 3071

Design Pattern: Bridge 模式

Bridge模式定义 :将抽象和行为划分开来,各自独立,但能动态的结合。 任何事物对象都有抽象和行为之分,例如人,人是一种抽象,人分男人和女人等;人有行为,行为也有各种具体表现,所以,“人”与“人的行为”两个概念也反映了抽象和行为之分。 在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是包含在一个对象中,但是,...

Chinaxxren 137

Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量

在移动互联网时代,H5页面因其跨平台、低成本、易传播的特性,成为许多企业的首选。Uniapp作为一款优秀的前端跨端开发框架,能够快速开发H5、小程序、App等多端应用。然而,由于Uniapp默认采用SPA(单页应用)架构,H5端在SEO(搜索引擎优化)方面存在一定劣势,如爬虫难以抓取动态内容、页面标题和描述不易优化等。 本文将系统性地介绍Uniapp H5端的SEO优化方案,涵盖基础优化、SPA优化策略、内容优化、技术优化、外部优化及监测分析,帮助开发者提升网站在搜索引擎中的排名,获取更多自然流量。

vvilkin的学习备忘 1971

TwinCAT 3 实战指南:从系统配置到高级运动控制

本文详细介绍了TwinCAT 3工业自动化控制平台的实战应用,从系统配置、PLC编程到EtherCAT总线配置和高级运动控制。通过倍福(Beckhoff)的TwinCAT 3平台,工程师可以高效实现复杂的工业自动化任务,包括运动控制、PLC编程等。文章还提供了常见问题排查和性能优化技巧,帮助用户提升系统稳定性和实时性。

weixin_30831529的博客 304

设计模式之桥接模式(Bridge Design Pattern)

桥接模式(Bridge Design Pattern),也叫作桥梁模式。在 GoF 的《设计模式》一书中,桥接模式是这么定义的:“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化”。 桥梁模式从名字来看很具象,但从定义来看又很抽象难懂。对于初学设计模式,桥梁最难理解的一种模式之一。 本文我们从一个飞机的例子慢慢演化,来理解桥

xjj1314的专栏 760

产品经理如何运用AI提升工作效率

AI技术的应用为产品经理的工作流程带来了显著的效率提升。从需求收集到产品上线,AI可以在多个阶段提供智能化支持,帮助产品经理更好地理解用户需求、优化产品设计、提高开发和测试效率。在未来,随着AI技术的不断发展,产品经理将能够更加高效地管理产品生命周期,为用户提供更优质的产品体验。应用 | AI + 千行百业欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

不想宅的冷同学 1336

DesignPattern_Java:Bridge Pattern

桥梁模式 Bridge Pattern 桥接模式Decouple an abstraction from its implementation so that the two can vary independently.将抽象和实现解耦,使得两者可以独立地变化。抽象化角色(Abstraction):该角色抽象化的给出定义,并保存一个对实现化对象的引用。package com.DesignPatte

Anonymous 688

海外最新AI营销AI销售书籍推荐AI营销培训讲师AI销售培训讲师人工智能营销培训师人工智能销售培训师AI赋能营销培训AI赋能销售培训企业AI营销内训企业AI销售内训AI营销课程讲师AI销售课程讲师

专栏|AI营销与AI销售实战 · 第46期在这个人类与算法共舞的时代,销售,已经不是你我熟悉的那个“打电话、见客户、做PPT”的老行当了。你还以为销售是“打感情牌”?错了,情感要继续,但方式已经升级。你还以为AI只是“写写文案”?错了,文案只是皮毛,真正的杀器,是思维方式的重构,是认知地图的重绘。首先,我们需要明确一个事实:AI并不会消灭销售这个职业,但它必然会重新定义销售的本质。在销售领域,真正的制胜之道不是简单地采用AI工具,而是的能力。

Akibfrycc的博客 1101

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

背景模糊 是一个很实用的功能,它可以帮助游戏在视觉上有更好的专注力和表现力。 实现模糊的种类和方式有很多种,大家自行选择适合自己的就可以了。 下面一起来看下本文实现背景模糊的效果和使用方式吧!

努力前行,总会成为自己心中的那道光 4万+

23种设计模式——桥接模式 (Bridge Pattern)详解

本文介绍了23种经典设计模式之——桥接模式(Bridge Pattern)的使用及说明

Meteors.的博客 1224

PyQt 随笔:信号与槽的两种使用方法:@pyqtSlot 和 connect

在 PyQt 中,信号与槽是实现事件驱动的一种重要机制。通过信号与槽的连接,可以实现对象之间的通信,例如在用户界面中响应按钮点击事件或者数据的变化等。PyQt 提供了两种主要的方法来创建信号与槽的连接:@pyqtSlot 装饰器和 connect 方法。本文将详细介绍这两种方法,并提供相应的源代码示例。在上面的示例中,我们定义了一个名为。

QasdCpp的博客 763

Bridge Design Pattern

“Decouple an abstraction from its implementation so that the two can vary independently” is the intent for bridge design pattern as stated by GoF. Bridge design pattern is a modified version of the no

poijm 738

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【设计模式】Bridge Design pattern 桥接模式

JDBC API和JDBC Driver, JDBC API接口去管理连接和解析操作返回的数据,但是底层具体是怎么做连接的,怎么做查询的是JDBC Driver来做的,在使用JDBC API的时候需要指定不同的JDBC Driver,这也是桥接模式的一个特点,具体实现是需要在使用的时候再指定的。如果是组合的方式,此时增加一个形状,那就只需要增加一个形状的类,要增加一个颜色也只用增加一个颜色的类,变化就被控制住了。将一个很大的类或者一堆紧密相关的类拆分成抽象和接口,让他们分别来管理不同的变化。

lingfy1234的博客 483

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Design Patterns之Bridge Pattern学习总结

  今晚看了Bridge模式,本想总结时再自己想个例子,不过没有想到,于是就引用李建忠老师的C#设计模式之Bridge模式中的坦克例子吧,加深一下理解。文中要是有不对的地方还请大家指点。   Bidge模式,是为了应对多维度的变化的情况,先不管那么多,例子先上。   假设现在要开发一个平常玩的那种坦克游戏,但这个游戏要有两个版本,PC版的和手机版的,其中坦克有许多型号,但PC版所有的坦...

weixin_33975951的博客 124

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

设计模式(design pattern )之桥接模式(bridge pattern)

摘要:本文展示了桥接模式在音频播放系统中的应用实现。通过定义MusicFormat接口作为实现化角色(含MP3、MP4两种具体格式),与PlayDevice抽象化角色(含Apple和Windows两种播放设备)相分离。这种设计使得格式解码和设备播放可以独立变化,通过组合方式实现功能扩展。测试代码演示了不同设备播放不同格式音频的场景,体现了桥接模式"抽象与实现分离"的核心思想。

RR1335 之代码才是动力源 210

Head First 设计模式 Design Pattern 附录 Bridge, Builder, Chain, Flyweight, Interpreter

附录A: 余下的模式 1桥接 Bridge 不只改变实现, 也改变抽象 >优点 将实现解耦 让其和UI之间不再绑定; 抽象和实现可以独立扩展互不影响; 对于"具体的抽象类"所做的改变不影响客户 >用途和缺点 适合需要跨越多个平台的图形和窗口系统上; 当需要用不同的方式改变接口和实现时; 增加了复杂度; 1 2 3 4 5

Fix it 961

C#设计模式之七桥接模式(Bridge Pattern)【结构型】

C#设计模式之七桥接模式(Bridge Pattern)【结构型】 原文:C#设计模式之七桥接模式(Bridge Pattern)【结构型】一、引言 今天我们要讲【结构型】设计模式的第二个模式,该模式是【桥接模式】,也有叫【桥模式】的,英文名称:Bridge Pattern。大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜...

weixin_30315435的博客 95

pimpl idiom vs. bridge design pattern

http://stackoverflow.com/questions/2346163/pimpl-idiom-vs-bridge-design-pattern 转载于:https://www.cnblogs.com/hustxujinkang/p/5104376.html

weixin_30402085的博客 126

设计模式——桥接模式(Bridge Pattern)

桥接模式是一种结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。

ddm 1838

Design Pattern - Structural Patterns - Bridge Pattern

2007 Section 2, Chapter 4 Bridge Pattern Concept In the Bridge pattern we allow the instance variable to be not a concrete type but an abstract type, thus giving us

Vincent's Tech Blog 401

[review]Design Pattern:Bridge

Bridge The book told me that this pattern is dedicated to decouple the abstraction from its implemetation so they can vary by themself without affecting each others. To be honest, I don't know ...

weixin_30505043的博客 115

Design Pattern - Bridge Pattern

class BridgePattern { public static void Main() { IReport reportMonthly = new MonthlyReport(); IReport reportYearly = new YearlyReport(); ...

weixin_30677073的博客 141
上一篇: Maven使用第三方jar文件的两种方法
youhaodeyi
博客等级 码龄21年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值