Bridge和Adapter模式之间有什么区别?

有帮助吗?

解决方案

  

“适配器使设计完成后可以正常工作;桥让他们   他们之前的工作。 [GoF,p219]"

实际上,适配器模式在您拥有现有代码时非常有用,无论是第三方还是内部代码,但是您无法控制,或者无法更改以满足您需要的界面它来。例如,我们有一个SuperWeaponsArray可以控制一系列精美的世界末日设备。

public class SuperWeaponsArray {
  /*...*/

  public void destroyWorld() {
    for (Weapon w : armedWeapons) {
      w.fire();
    }
  }
}

大。除了我们意识到我们的武器库中有一个核装置,它早于转换到武器界面。但我们真的很喜欢它在这里工作......所以我们做了什么......楔入它!

NukeWeaponsAdaptor - 基于我们的Nuke类,但导出Weapon接口。甜蜜,现在我们肯定会摧毁这个世界。它看起来像是一块混合物,但它使事情有效。


Bridge 模式是您预先实现的模式 - 如果您知道有两个正交层次结构,它提供了一种方法来分离接口和实现,使您无法获得疯狂的课程数量。假设你有:

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

MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile

其他提示

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

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

如果您有一组公司标准的Web服务API,您希望将其提供给另一个应用程序的现有可扩展性界面,您可以考虑编写一组适配器来执行此操作。请注意,有一个灰色区域,这更多地是关于技术上如何定义模式,因为其他模式如外观是相似的。

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

Bridge模式将允许您可能具有算法或系统的替代实现。

虽然不是经典的Bridge模式示例,但想象一下,如果你有一些数据存储的实现:一个在空间有效,另一个在原始性能方面有效......并且你有一个商业案例可以在你的应用程序或框架。

就您的问题而言,“我可以使用哪种模式”,答案是,只要它对您的项目有意义!也许考虑提供澄清编辑,以指导您认为需要使用其中一个的讨论。

<强> 适配器:

  1. 这是一种结构模式
  2. 使用两个不兼容的接口
  3. 非常有用 dofactory 文章中的

    UML图表

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

    适配器 :将接口Adaptee调整为目标接口。

    Adaptee :定义需要调整的现有界面。

    客户端 :与符合Target界面的对象协作。

    示例:

    正方形和矩形是两种不同的形状,每种形状的区域()都需要不同的方法。但Square仍然在Rectangle界面上工作,并转换了一些属性。

    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. 因为组合已被用来代替继承,所以有可能
    4. 编辑:(根据@quasoft建议)

      此模式中有四个组件。

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

      2. RefinedAbstraction :它实现了抽象:

      3. Implementor :它定义了一个实现接口

      4. ConcreteImplementor :它实现了Implementor接口。

      5. 代码段:

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

        相关文章:

        您何时使用桥接模式?它与适配器模式有何不同?

        来自 sourcemaking 文章的

        主要差异

        1. 适配器使设计完成后可以正常工作; Bridge让它们在它们工作之前就可以工作了。
        2. Bridge是预先设计的,让抽象和实现独立变化。适配器经过改装,可以使不相关的类一起工作。

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

假设您有一个带有(通用/抽象)绘图功能的抽象Shape类和一个实现Shape的Circle。桥模式只是一种双向抽象方法,用于解耦实现(在Circle中绘制)和通用/抽象功能(在Shape类中绘制)。

这究竟是什么意思?乍一看,这听起来像你已经做过的事情(通过依赖倒置)。所以不用担心有一个更少的模块代码库。但它背后的哲学更为深刻。

根据我的理解,当我需要添加与当前系统密切相关的新类(如RedCircle或GreenCircle)时,可能会出现使用模式的需要,并且它们只有一个功能(如颜色)不同。而且我需要Bridge模式,特别是如果要频繁更改现有系统类(Circle或Shape)并且您不希望新添加的类受这些更改影响。这就是为什么将通用绘图功能抽象到新界面中,以便您可以独立于Shape或Circle来改变绘图行为。

Bridge是改进的适配器。 Bridge包括适配器并为其增加了额外的灵活性。 以下是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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top