桥接模式报告

桥接模式报告

ID:40200426

大小:371.90 KB

页数:6页

时间:2019-07-25

桥接模式报告_第1页
桥接模式报告_第2页
桥接模式报告_第3页
桥接模式报告_第4页
桥接模式报告_第5页
资源描述:

《桥接模式报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、桥接模式1问题的提出生活中的一个例子:拿汽车在路上行驶的来说。既有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。这你会发现,对于交通工具(汽车)有不同的类型,它们所行驶的环境(路)也有不同类型,在软件系统中就要适应两个方面(不同车型,不同道路)的变化,怎样实现才能应对这种变化呢?桥接设计模式的出现能够很好的解决这一问题2桥接模式的提出在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridg

2、e模式,即桥接模式。3桥接模式的定义和结构3.1桥接模式的定义GOF在《设计模式》中给桥梁模式的定义为:将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的抽象部分和实现部分不是我们通常认为的父类与子类、接口与实现类的关系,而是组合关系。也就是说,当一颗继承树上一些子树存在了类似的行为。这意味着这些子树中存在了几乎重复的功能代码。这时我们不妨将这些行为提取出来,也采用接口的方式提供出来,然后以组合的方式将服务提供给原来的子类。这样就达到了前端和被使用的后端独立的变化,而且还达到了后端的重用。3.2桥接模式的结构3.2.1桥接模式的角色(1)抽象(Abstract

3、ion)角色:它定义了抽象类的接口而且维护着一个指向实现(Implementor)角色的引用。(2)精确抽象(RefinedAbstraction)角色:实现并扩充由抽象角色定义的接口。(3)实现(Implementor)角色:给出了实现类的接口,这里的接口与抽象角色中的接口可以不一致。(4)具体实现(ConcreteImplementor)角色:给出了实现角色定义接口的具体实现下图为桥接模式的类图(图3.2.1)图3.2.1如图所示,模式把两个角色之间的继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立的变化,这也是桥接模式的本意。4桥接模式的实例以之前的问

4、题为例,关于公路和汽车的多维度变化,通过传统方法和使用桥接模式分别实现,比较两者的不同4.1传统方法的实现通过继承来实现传统方式的类结构图代码实现//基类路classRoad{voidrun(){System.out.println("路");}}//市区街道classStreetextendsRoad{voidrun(){System.out.println("市区街道");}}//高速公路classSpeedWayextendsRoad{voidrun(){System.out.println("高速公路");}}//小汽车在市区街道行驶classCarOnStre

5、etextendsStreet{voidrun(){System.out.println("小汽车在市区街道行驶");}}//小汽车在高速公路行驶classCarOnSpeedWayextendsSpeedWay{voidrun(){System.out.println("小汽车在高速公路行驶");}}//公交车在市区街道行驶classBusOnStreetextendsStreet{voidrun(){System.out.println("公交车在市区街道行驶");}}//公交车在高速公路行驶classBusOnSpeedWayextendsSpeedWay{voi

6、drun(){System.out.println("公交车在高速公路行驶");}}缺点:仔细分析就可以发现,它还是存在很多问题,首先它在遵循开放-封闭原则的同时,违背了类的单一职责原则,即一个类只有一个引起它变化的原因,而这里引起变化的原因却有两个,即路类型的变化和汽车类型的变化;其次是重复代码会很多,不同的汽车在不同的路上行驶也会有一部分的代码是相同的;再次是类的结构过于复杂,继承关系太多,难于维护,最后最致命的一点是扩展性太差。如果变化沿着汽车的类型和不同的道路两个方向变化,我们会看到这个类的结构会迅速的变庞大。4.2桥接设计模式实现先看下类结构图图4.2.1图4

7、.2.2代码实现:abstractclassAbstractRoad{AbstractCaraCar;voidrun(){};}abstractclassAbstractCar{voidrun(){};}classStreetextendsAbstractRoad{voidrun(){aCar.run();System.out.println("在市区街道行驶");}}classSpeedWayextendsAbstractRoad{voidrun(){aCar.run();System.out.println("在高速公路行驶");}}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。