




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
桥接模式1问题的提出生活中的一个例子: 拿汽车在路上行驶的来说。既有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。这你会发现,对于交通工具(汽车)有不同的类型,它们所行驶的环境(路)也有不同类型,在软件系统中就要适应两个方面(不同车型,不同道路)的变化,怎样实现才能应对这种变化呢?桥接设计模式的出现能够很好的解决这一问题2 桥接模式的提出在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式,即桥接模式。3桥接模式的定义和结构3.1桥接模式的定义GOF 在设计模式中给桥梁模式的定义为:将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的抽象部分和实现部分不是我们通常认为的父类与子类、接口与实现类的关系,而是组合关系。也就是说,当一颗继承树上一些子树存在了类似的行为。这意味着这些子树中存在了几乎重复的功能代码。这时我们不妨将这些行为提取出来,也采用接口的方式提供出来,然后以组合的方式将服务提供给原来的子类。这样就达到了前端和被使用的后端独立的变化,而且还达到了后端的重用。3.2桥接模式的结构3.2.1桥接模式的角色(1)抽象( Abstraction )角色:它定义了抽象类的接口而且维护着一个指向实现(Implementor)角色的引用。 (2)精确抽象(RefinedAbstraction)角色:实现并扩充由抽象角色定义的接口。 (3)实现(Implementor)角色:给出了实现类的接口,这里的接口与抽象角色中的接口可以不一致。 (4)具体实现(ConcreteImplementor)角色:给出了实现角色定义接口的具体实现下图为桥接模式的类图(图3.2.1)图3.2.1如图所示,模式把两个角色之间的继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立的变化,这也是桥接模式的本意。4桥接模式的实例以之前的问题为例,关于公路和汽车的多维度变化,通过传统方法和使用桥接模式分别实现,比较两者的不同4.1传统方法的实现通过继承来实现传统方式的类结构图代码实现/基类路 class Road void run() System.out.println(路); /市区街道 class Street extends Road void run() System.out.println(市区街道); /高速公路 class SpeedWay extends Road void run() System.out.println(高速公路); /小汽车在市区街道行驶 class CarOnStreet extends Street void run() System.out.println(小汽车在市区街道行驶); /小汽车在高速公路行驶 class CarOnSpeedWay extends SpeedWay void run() System.out.println(小汽车在高速公路行驶); /公交车在市区街道行驶 class BusOnStreet extends Street void run() System.out.println(公交车在市区街道行驶); /公交车在高速公路行驶 class BusOnSpeedWay extends SpeedWay void run() System.out.println(公交车在高速公路行驶); 缺点:仔细分析就可以发现,它还是存在很多问题,首先它在遵循开放-封闭原则的同时,违背了类的单一职责原则,即一个类只有一个引起它变化的原因,而这里引起变化的原因却有两个,即路类型的变化和汽车类型的变化;其次是重复代码会很多,不同的汽车在不同的路上行驶也会有一部分的代码是相同的;再次是类的结构过于复杂,继承关系太多,难于维护,最后最致命的一点是扩展性太差。如果变化沿着汽车的类型和不同的道路两个方向变化,我们会看到这个类的结构会迅速的变庞大。4.2桥接设计模式实现先看下类结构图图4.2.1图4.2.2代码实现:abstract class AbstractRoad AbstractCar aCar; void run(); abstract class AbstractCar void run(); class Street extends AbstractRoad void run() aCar.run(); System.out.println(在市区街道行驶); class SpeedWay extends AbstractRoad void run() aCar.run(); System.out.println(在高速公路行驶); class Car extends AbstractCar void run() System.out.print(小汽车); class Bus extends AbstractCar void run() System.out.print(公交车); public static void main(String args) AbstractRoad speedWay = new SpeedWay(); speedWay.aCar = new Car(); speedWay.run(); AbstractRoad street = new Street(); street.aCar = new Bus(); street.run(); 结果如下:通过对象组合的方式,桥接模式把两个角色之间的继承关系改为了耦合的关系,从而使各自独立的变化。5桥接模式使用的环境和优势由上面我们分析得来的桥梁模式,可以看出来桥梁模式应该适用于以下环境: (1)当你的系统中有多个地方要使用到类似的行为,或者是多个类似行为的组合时,可以考虑使用桥梁模式来提高重用,并减少因为行为的差异而产生的子类。(2)系统中某个类的行为可能会有几种不同的变化趋势,为了有效的将变化封装,可以考虑将类的行为抽取出来。6桥接模式的优点(1)将可能变化的部分单独封装起来,使得变化产生的影响最小,不用编译不必要的代码。(2)抽象部分和实现部分可以单独的变动,并且每一部分的扩充都不会破坏桥梁模式搭起来架子。 (3)对于客户程序来说,你的实现细节是透明的。 7桥接模式与组合模式的比较依据合成/聚合原则,优先使用类之间的不同组合,来实现各个类要表现的功能,而不是使用继承。比如说:继承会延续父类的功能,然而,并不是所有的子类都需要这样的功能,但是抽象出的东西在父类,导致子类又必须要实现它,这样,父类就越来越庞大,子类又多了很多不必要的东西。因此,桥接模式更强调类之间的组合从而实现解耦。对比组合模式,它更强调的是部分与整体间的组合,桥接模式强调的是平行级别上不同类的组合。8参考文献1程杰,大话设计模式,清华大学出版社.2007-1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养殖水产品智能保鲜技术创新创业项目商业计划书
- 智能能源智能调度创新创业项目商业计划书
- 脑机接口意念控制轮椅创新创业项目商业计划书
- 自动化版权管理创新创业项目商业计划书
- 2025年盖州市消防员考试笔试试题(含答案)
- 电商SaaS平台多站点管理创新创业项目商业计划书
- 艺术交流社交场创新创业项目商业计划书
- 园林生态环保教育活动创新创业项目商业计划书
- 移动设备远程控制技术创新创业项目商业计划书
- 2025年社交媒体平台舆情监控与危机公关应对策略优化报告
- 2025年湖南湘西自治州州直事业单位招聘考试笔试试卷附答案
- 幼儿园安全责任书及后勤管理制度
- 消防车辆事故课件
- 2026届四川省宜宾市普通高中高一化学第一学期期末统考试题含解析
- 《2型糖尿病中医防治指南(2024版)》解读课件
- 剑阁县普安镇污水处理厂扩容建设项目环评报告
- 商务楼宇管理办法
- 肺炎护理试题填空及答案
- 社用手机管理办法
- 心电监护操作常见并发症预防及处理
- 学校食堂各种检查记录表格表册11
评论
0/150
提交评论