`
wenlongsust
  • 浏览: 72388 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

设计模式:桥接模式优点比较

 
阅读更多

原文链接:http://blog.csdn.net/jason0539/article/details/22568865

生活中的一个例子:
拿汽车在路上行驶的来说。既有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。这你会发现,对于交通工具(汽车)有不同的类型,它们所行驶的环境(路)也有不同类型,在软件系统中就要适应两个方面(不同车型,不同道路)的变化,怎样实现才能应对这种变化呢?

概述:
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
意图:
   将抽象部分与实现部分分离,使它们都可以独立的变化。
——《设计模式》GOF

上面这些话我也没看懂。。太抽象了,但是一看代码你就明白是怎么回事了。
结构图:

传统的做法:
通过类继承的方式来做上面的例子;

先看一下类结构图:

代码实现:

  1. //基类路
  2. classRoad{
  3. voidrun(){
  4. System.out.println("路");
  5. }
  6. }
  7. //市区街道
  8. classStreetextendsRoad{
  9. voidrun(){
  10. System.out.println("市区街道");
  11. }
  12. }
  13. //高速公路
  14. classSpeedWayextendsRoad{
  15. voidrun(){
  16. System.out.println("高速公路");
  17. }
  18. }
  19. //小汽车在市区街道行驶
  20. classCarOnStreetextendsStreet{
  21. voidrun(){
  22. System.out.println("小汽车在市区街道行驶");
  23. }
  24. }
  25. //小汽车在高速公路行驶
  26. classCarOnSpeedWayextendsSpeedWay{
  27. voidrun(){
  28. System.out.println("小汽车在高速公路行驶");
  29. }
  30. }
  31. //公交车在市区街道行驶
  32. classBusOnStreetextendsStreet{
  33. voidrun(){
  34. System.out.println("公交车在市区街道行驶");
  35. }
  36. }
  37. //公交车在高速公路行驶
  38. classBusOnSpeedWayextendsSpeedWay{
  39. voidrun(){
  40. System.out.println("公交车在高速公路行驶");
  41. }
  42. }
  43. //测试
  44. publicstaticvoidmain(String[]args){
  45. //小汽车在高速公路行驶
  46. CarOnSpeedWaycarOnSpeedWay=newCarOnSpeedWay();
  47. carOnSpeedWay.run();
  48. //公交车在市区街道行驶
  49. BusOnStreetbusOnStreet=newBusOnStreet();
  50. busOnStreet.run();
  51. }

缺点:
但是我们说这样的设计是脆弱的,仔细分析就可以发现,它还是存在很多问题,首先它在遵循开放-封闭原则的同时,违背了类的单一职责原则,即一个类只有一个引起它变化的原因,而这里引起变化的原因却有两个,即路类型的变化和汽车类型的变化;其次是重复代码会很多,不同的汽车在不同的路上行驶也会有一部分的代码是相同的;

再次是类的结构过于复杂,继承关系太多,难于维护,最后最致命的一点是扩展性太差。如果变化沿着汽车的类型和不同的道路两个方向变化,我们会看到这个类的结构会迅速的变庞大。

应用设计模式
桥接模式(Bridge)来做;

先看一下类结构图:

代码实现:

  1. abstractclassAbstractRoad{
  2. AbstractCaraCar;
  3. voidrun(){};
  4. }
  5. abstractclassAbstractCar{
  6. voidrun(){};
  7. }
  8. classStreetextendsAbstractRoad{
  9. @Override
  10. voidrun(){
  11. //TODOAuto-generatedmethodstub
  12. super.run();
  13. aCar.run();
  14. System.out.println("在市区街道行驶");
  15. }
  16. }
  17. classSpeedWayextendsAbstractRoad{
  18. @Override
  19. voidrun(){
  20. //TODOAuto-generatedmethodstub
  21. super.run();
  22. aCar.run();
  23. System.out.println("在高速公路行驶");
  24. }
  25. }
  26. classCarextendsAbstractCar{
  27. @Override
  28. voidrun(){
  29. //TODOAuto-generatedmethodstub
  30. super.run();
  31. System.out.print("小汽车");
  32. }
  33. }
  34. classBusextendsAbstractCar{
  35. @Override
  36. voidrun(){
  37. //TODOAuto-generatedmethodstub
  38. super.run();
  39. System.out.print("公交车");
  40. }
  41. }
  42. publicstaticvoidmain(String[]args){
  43. AbstractRoadspeedWay=newSpeedWay();
  44. speedWay.aCar=newCar();
  45. speedWay.run();
  46. AbstractRoadstreet=newStreet();
  47. street.aCar=newBus();
  48. street.run();
  49. }

可以看到,通过对象组合的方式,Bridge 模式把两个角色之间的继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立的变化,这也是Bridge模式的本意。
这样增加了客户程序与路与汽车的耦合。其实这样的担心是没有必要的,因为这种耦合性是由于对象的创建所带来的,完全可以用创建型模式去解决。在应用时结合创建型设计模式来处理具体的问题。
应用设计模式:
桥接模式(Bridge)来做(
多维度变化);
结合上面的例子,增加一个维度"人",不同的人开着不同的汽车在不同的路上行驶(三个维度);
结合上面增加一个类"人",并重新调用.
代码实现:

  1. abstractclassPeople{
  2. AbstractRoadroad;
  3. voidrun(){}
  4. }
  5. classManextendsPeople{
  6. @Override
  7. voidrun(){
  8. //TODOAuto-generatedmethodstub
  9. super.run();
  10. System.out.print("男人开着");
  11. road.run();
  12. }
  13. }
  14. classWomanextendsPeople{
  15. @Override
  16. voidrun(){
  17. //TODOAuto-generatedmethodstub
  18. super.run();
  19. System.out.print("女人开着");
  20. road.run();
  21. }
  22. }
  23. publicstaticvoidmain(String[]args){
  24. AbstractRoadspeedWay=newSpeedWay();
  25. speedWay.aCar=newCar();
  26. Peopleman=newMan();
  27. man.road=speedWay;
  28. man.run();
  29. }


效果及实现要点:
1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同路上的不同汽车。
3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

适用性:
在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。


总结:
Bridge模式是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。




小龙评论


通过桥接模式是否使用的比较,优点很明显。这样,可以更加容易地理解桥接模式的内涵。

另外,该博主写的设计模式专栏http://blog.csdn.net/column/details/jason0539-shejimoshi.html,的确都很不错,力荐!


分享到:
评论

相关推荐

    java常用设计模式-桥接模式

    Java 桥接模式 设计模式 桥接模式(Bridge Pattern)是一种常用的设计模式,它将抽象化和实现化解耦,使用封装、聚合以及继承等基本技术,将两个独立变化的维度通过抽象化的方式进行桥接,从而降低了它们之间的耦合...

    设计模式之桥接模式

    8. **与其他模式的比较**:可能会对比桥接模式与装饰器模式、适配器模式等的区别,强调桥接模式关注的是抽象与实现的分离,而其他模式则专注于不同的设计目标。 9. **实战演练**:通过实际编程示例,演示如何在项目...

    设计模式 - 桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,使得系统具有更好的可扩展性和灵活性。 桥接模式的主要组成部分...

    设计模式之桥接模式BridgePattern

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它主要解决的是在软件设计中,当抽象和实现之间存在紧密耦合时,如何使这两者能够独立地变化。这种模式通过引入一个抽象层来分离接口和实现,使得它们可以...

    设计模式之桥接模式.pdf

    ### 设计模式之桥接模式详解 #### 一、桥接模式概述 桥接模式(Bridge Pattern)是一种常用的结构型设计模式,它主要用于解决抽象部分和实现部分的耦合问题。这种模式通过将抽象和实现分离,使得两者可以独立变化...

    C++设计模式之桥接模式(Bridge)

    C++设计模式之桥接模式(Bridge) 桥接模式(Bridge)是一种结构型设计模式,它的主要作用是将抽象部分与实现部分分离,使它们可以独立地变化。这使得系统更加灵活、可扩展和易于维护。 桥接模式的定义 桥接模式...

    24设计模式-桥接模式1

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地进行变化。在软件工程中,这种模式对于处理有多种实现方式的抽象概念非常有用,可以降低系统的耦合度,提高模块间的独立性,使得代码更...

    23钟设计模式之 桥接模式

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它的主要目的是将抽象部分与实现部分解耦,使得它们可以独立地进行变化。在上述的例子中,通过将电视台(CCTV)与节目(Program)进行分离,实现了两者...

    简单了解C#设计模式编程中的桥接模式

    桥接模式是一种结构型设计模式,它旨在将抽象部分与实现部分分离,使得两者能够独立地进行变化。在C#编程中,桥接模式经常被用来解耦逻辑层与数据操作层,以提高代码的可维护性和扩展性。 在桥接模式中,有两个主要...

    软件设计模式(java版)习题答案.pdf

    正确使用设计模式具有以下优点: 1. 可以提高程序员的思维能力、编程能力和设计能力。 2. 使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。 3. 使设计的代码可重用性...

    javascript设计模式 – 桥接模式原理与应用实例分析

    桥接模式是一种设计模式,主要目的是将抽象部分与其实现部分分离,以便两者可以独立地进行扩展。在JavaScript中,这种模式可以用于处理多个相互独立变化的方面,从而提高代码的灵活性和可维护性。以下是对桥接模式的...

    [结构型模式] 桥接模式的理解

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地进行变化。在软件工程中,这种模式对于处理系统中大量类的分类和扩展具有显著优势,尤其当需要独立地改变它们之间的关系时。 首先,...

    详解JavaScript设计模式开发中的桥接模式用法_.docx

    理解 JavaScript 设计模式开发中的桥接模式用法 桥接模式是JavaScript设计模式中的一种重要模式,它将抽象部分与实现部分分离开,使两者可以独立地改变,并且可以一起和谐地工作。这种模式对于JavaScript中的大型...

    软件开发方法与环境--设计模式(ppt)

    4. **设计模式的优点**: - 提高代码的可读性和可维护性,因为模式提供了通用的解决方案和命名约定。 - 加强了代码的复用性,减少重复工作。 - 促进团队间的沟通,因为开发人员都熟悉设计模式,可以更快地理解...

    用代码和UML图化解设计模式之桥接模式的深入分析

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与其实现部分解耦,使得它们可以独立地进行变化。这种模式在软件工程中被广泛应用于当一个类想有多重实现方式,或者当一个类的实现可能...

    几种常用的设计模式

    设计模式是软件开发中的一种最佳实践,源自建筑领域,由著名建筑师克里斯托弗·亚历山大在其著作中首次提出。这些模式描述了在特定情况下经常出现的问题以及这些问题的解决方案。1990年代,Erich Gamma等人将设计...

    从追MM浅谈Java的23种设计模式

    Java的23种设计模式是软件工程中的一种经典思想,它们是解决常见编程问题的成熟解决方案,被广泛应用于各种项目中。设计模式并不是特定的代码或库,而是对在特定情境下,如何组织代码和交互的一种描述。这些模式是...

    设计模式学习笔记(九)桥接模式及其应用.doc

    桥接模式(Bridge Pattern)作为23种经典设计模式之一,是一种常用于处理对象层次结构的结构型设计模式,旨在通过将抽象和实现解耦来实现两者之间的独立变化,进而提升系统的可维护性和灵活性。本篇文章将深入探讨...

    设计模式:可复用面向对象软件的基础4

    ### 设计模式:可复用面向对象软件的基础之结构型模式 #### 1. 引言 设计模式作为软件工程领域的重要组成部分,旨在提供解决常见问题的标准化解决方案,特别是对于可复用面向对象软件的设计与实现。在面向对象编程...

Global site tag (gtag.js) - Google Analytics