首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网桥模式和适配器模式的区别

网桥模式和适配器模式的区别
EN

Stack Overflow用户
提问于 2009-09-15 04:51:32
回答 11查看 65.9K关注 0票数 154

网桥模式和适配器模式有什么不同?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-09-15 05:43:55

“适配器使事物在设计之后工作;桥使它们在设计之前工作。GoF,p219”

实际上,当您拥有现有代码时,适配器模式非常有用,无论是第三方代码,还是内部代码,但不在您的控制范围之内,或者无法更改以完全满足您所需的接口。例如,我们有一个可以控制一系列末日设备的SuperWeaponsArray。

代码语言:javascript
复制
public class SuperWeaponsArray {
  /*...*/

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

太棒了。除非我们意识到我们的武器库中有一个核装置,它在转换到武器接口之前就已经存在了。但我们真的希望它能在这里工作。那我们该怎么做..。把它塞进去!

基于NukeWeaponsAdaptor的我们的Nuke类,但导出武器接口。甜心,现在我们肯定可以毁灭世界了。这看起来有点杂乱无章,但它能让事情变得更好。

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

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

MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile

票数 195
EN

Stack Overflow用户

发布于 2009-09-15 05:00:30

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

Adapter模式更多的是让您的现有代码与较新的系统或界面协同工作。

如果您有一组公司标准的web服务API,您希望为另一个应用程序的现有可扩展性接口提供这些API,则可以考虑编写一组适配器来实现此目的。请注意,这里有一个灰色区域,这更多的是关于如何在技术上定义模式,因为像facade这样的其他模式是相似的。

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

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

虽然不是一个典型的桥接模式示例,但想象一下,如果您有几个数据存储的实现:一个在空间上高效,另一个在原始性能上高效……并且您有在您的应用程序或框架中提供这两者的业务案例。

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

票数 17
EN

Stack Overflow用户

发布于 2016-02-11 00:04:41

适配器:

  1. It is a structural
  2. 使用两个不兼容的接口

非常有用

UML图:来自dofactory文章的

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

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

Adaptee:定义需要适配的现有接口。

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

示例:

正方形和矩形是两种不同的形状,获取它们各自的area()需要不同的方法。但Square仍然在矩形界面上工作,并转换了一些属性。

代码语言:javascript
复制
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. It is structural
  2. 它将抽象与其实现解耦,两者都可以改变继承之所以可能,是因为使用了组合来代替继承

编辑:(根据@quasoft建议)

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

  1. Abstraction:它定义了interface
  2. RefinedAbstraction:,它实现了abstraction:
  3. Implementor:,它定义了implementation
  4. ConcreteImplementor:的接口,它实现了Implementor接口。

代码片段:

代码语言:javascript
复制
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. 桥接器是预先设计的,让抽象和实现独立变化。对适配器进行了改造,使不相关的类协同工作。
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1425171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档