代码之家  ›  专栏  ›  技术社区  ›  Firoz

桥接模式和适配器模式的区别

  •  96
  • Firoz  · 技术社区  · 16 年前

    桥接器和适配器模式之间的区别是什么?

    6 回复  |  直到 7 年前
        1
  •  145
  •   gokareless    7 年前

    “适配器使事物在设计完成后工作;桥接器使它们工作。 先发制人。[GOF,P219]

    实际上, 适配器 当您拥有现有的代码时,模式是有用的,无论是第三方代码,还是内部代码,但不在您的控制范围内,或者是不可更改的代码,以完全满足您需要的接口。例如,我们有一个超级武器阵列,可以控制一系列的世界末日装置。

    public class SuperWeaponsArray {
      /*...*/
    
      public void destroyWorld() {
        for (Weapon w : armedWeapons) {
          w.fire();
        }
      }
    }
    

    伟大的。除非我们意识到我们的军火库中有一个核装置,它大大早于武器接口的转换。但我们真的很想在这里工作…那么我们该怎么做…把它插进去!

    核武器适配器-基于我们的核武器类,但导出武器接口。亲爱的,现在我们肯定可以毁灭世界了。这看起来有点笨拙,但它能让事情正常运转。


    这个 模式是您预先实现的——如果您知道您有两个正交的层次结构,它提供了一种将接口和实现分离的方法,这样您就不会得到大量的类。假设你有:

    MemoryMappedFile和DirectReadFile文件对象的类型。假设您希望能够从各种来源(可能是Linux与Windows实现等)读取文件。Bridge可帮助您避免以下情况:

    MemoryMappedWindows文件 MemoryMappedLinux文件 DirectReadWindows文件 直接读取Linux文件

        2
  •  13
  •   Jeff Wilcox    16 年前

    http://en.wikipedia.org/wiki/Adapter_pattern

    适配器模式更多的是让现有代码与较新的系统或接口一起工作。

    如果您有一组公司标准Web服务API,希望为其他应用程序的现有扩展性接口提供这些API,那么您可以考虑编写一组适配器来实现这一点。请注意,这里有一个灰色区域,这更多的是关于如何从技术上定义图案,因为其他图案(如立面)是相似的。

    http://en.wikipedia.org/wiki/Bridge_pattern

    桥接模式将允许您使用算法或系统的其他实现。

    虽然不是经典的桥接模式示例,但是可以想象一下,如果您有一些数据存储的实现:一个在空间上有效,另一个在原始性能上有效……你有一个商业案例可以在你的应用程序或框架中同时提供。

    关于你的问题,“我可以在哪里使用哪种模式”,答案是,无论它对你的项目有什么意义!也许可以考虑提供一个澄清编辑来指导讨论您认为需要在哪里使用其中一个。

        3
  •  8
  •   John Penner    13 年前

    这篇文章已经流传很久了。然而,重要的是要理解门面与适配器有点相似,但它并不完全相同。适配器将现有类“适配”为通常不兼容的客户端类。假设您有一个旧的工作流系统,您的应用程序将其用作客户机。你的公司可能会用一个新的“不兼容”的工作流程系统(在接口方面)来取代它。在大多数情况下,您可以使用适配器模式并编写实际调用新工作流引擎接口的代码。桥梁通常以不同的方式使用。如果您的系统需要与不同的文件系统(即本地磁盘、NFS等)一起工作,那么您可以使用桥接模式并创建一个抽象层来与所有文件系统一起工作。这基本上是桥模式的一个简单用例。外观和适配器确实共享一些属性,但是 立面通常用于简化现有的接口/类 .在EJB的早期,没有对EJB的本地调用。开发人员总是得到存根,将其缩小并称之为“远程伪”。这通常会导致性能问题(尤其是在实际通过线路调用时)。经验丰富的开发人员将使用facade模式向客户机提供非常粗粒度的接口。然后,这个外观将对不同的更细粒度的方法进行多次调用。总之,这大大减少了所需方法调用的数量,提高了性能。

        4
  •  8
  •   Ravindra babu    8 年前

    Adapter:

    1. 这是一种结构模式
    2. 使用两个不兼容的接口很有用

    UML图: dofactory 文章:

    enter image description here

    目标 :定义客户端使用的特定于域的接口。

    适配器 :使接口适应目标接口。

    适应者 :定义需要调整的现有接口。

    顾客 :与符合目标接口的对象协作。

    例子:

    正方形和矩形是两种不同的形状,每个形状的get area()需要不同的方法。但在矩形界面上仍然是方形的,它具有转换某些属性的功能。

    public class AdapterDemo{
        public static void main(String args[]){
            SquareArea s = new SquareArea(4);
            System.out.println("Square area :"+s.getArea());
        }
    }
    
    class RectangleArea {
        public int getArea(int length, int width){
            return length * width;
        }
    }
    
    class SquareArea extends RectangleArea {
    
        int length;
        public SquareArea(int length){
            this.length = length;
        }
        public int getArea(){
            return getArea(length,length);
        }
    }
    

    桥梁:

    1. 这是结构模式
    2. 它将抽象与实现分离,两者都可以独立变化。
    3. 这是可能的,因为组合被用来代替继承

    编辑: (根据@quasoft建议)

    在这个模式中有四个组件。

    1. 抽象化 :它定义了一个接口

    2. 扩充抽象类 :它实现抽象:

    3. 实现者 :它定义了一个用于实现的接口

    4. 混凝土实施者 :实现了实现者接口。

    代码片段:

    Gear gear = new ManualGear();
    Vehicle vehicle = new Car(gear);
    vehicle.addGear();
    
    gear = new AutoGear();
    vehicle = new Car(gear);
    vehicle.addGear();
    

    相关职位:

    When do you use the Bridge Pattern? How is it different from Adapter pattern?

    主要区别: sourcemaking 文章

    1. 适配器使事情在设计好之后就可以工作;桥接器使事情在设计好之前就可以工作。
    2. 桥接器是预先设计的,允许抽象和实现独立变化。适配器经过改装,使不相关的类可以一起工作。
        5
  •  0
  •   stdout    9 年前

    假设您有一个抽象形状类,它具有(通用/抽象)绘图功能和一个实现形状的圆。桥接模式只是一种双向抽象方法,用于将实现(圆中绘制)和通用/抽象功能(形状类中绘制)分离开来。

    这到底是什么意思?乍一看,这听起来像是你已经在做的事情(通过依赖倒置)。所以不用担心有一个更少的嘲笑或更多的模块化代码库。但它背后的哲学有点深奥。

    据我所知,当我需要添加与当前系统(如红圈或绿圈)密切相关的新类时,可能会出现使用模式的需求,这些类只因单个功能(如颜色)而不同。我需要桥接模式,特别是如果经常改变现有的系统类(圆形或形状),并且您不希望这些改变影响新添加的类。所以这就是为什么一般的绘图功能被抽象成一个新的界面,这样你就可以独立于形状或圆来改变绘图行为。

        6
  •  0
  •   polina-c    9 年前

    桥是改进的适配器。桥接器包括适配器并增加了额外的灵活性。 以下是Ravindra的答案图中的元素在模式之间的映射方式:

          Adapter  |    Bridge
        -----------|---------------
        Target     | Abstraction
        -----------|---------------
                   | RefinedAbstraction
                   |
                   |   This element is Bridge specific. If there is a group of 
                   |   implementations that share the same logic, the logic can be placed here.
                   |   For example, all cars split into two large groups: manual and auto. 
                   |   So, there will be two RefinedAbstraction classes.
        -----------|--------------- 
        Adapter    | Implementor
        -----------|---------------
        Adaptee    | ConcreteImplementor
    
    推荐文章