桥模式和适配器模式之间的差异
-
07-07-2019 - |
题
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模式示例,但想象一下,如果你有一些数据存储的实现:一个在空间有效,另一个在原始性能方面有效......并且你有一个商业案例可以在你的应用程序或框架。
就您的问题而言,“我可以使用哪种模式”,答案是,只要它对您的项目有意义!也许考虑提供澄清编辑,以指导您认为需要使用其中一个的讨论。
<强> 适配器: 强>
- 这是一种结构模式
- 使用两个不兼容的接口 非常有用 醇> dofactory 文章中的
- 是结构模式
- 它将抽象与其实现分离,两者都可以独立变化
- 因为组合已被用来代替继承,所以有可能 醇>
-
抽象:它定义了一个接口
-
RefinedAbstraction :它实现了抽象:
-
Implementor :它定义了一个实现接口
-
ConcreteImplementor :它实现了Implementor接口。
醇>
- 适配器使设计完成后可以正常工作; Bridge让它们在它们工作之前就可以工作了。
- Bridge是预先设计的,让抽象和实现独立变化。适配器经过改装,可以使不相关的类一起工作。 醇>
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);
}
}
<强> 桥: 强>
编辑:(根据@quasoft建议)
此模式中有四个组件。
代码段:
Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();
相关文章:
来自 sourcemaking 文章的主要差异
这篇文章已经存在了很长一段时间。但是,重要的是要理解外观有点类似于适配器,但它并不完全相同。适配器“适应”现有类到通常不兼容的客户端类。假设您有一个旧的工作流系统,您的应用程序将其用作客户端。您的公司可能会用新的“不兼容”替换工作流程系统。一个(就接口而言)。在大多数情况下,您可以使用适配器模式并编写实际调用新工作流引擎接口的代码。桥通常以不同的方式使用。如果您实际上有一个系统需要使用不同的文件系统(即本地磁盘,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