网桥模式和适配器模式有什么不同?
发布于 2009-09-15 05:43:55
“适配器使事物在设计之后工作;桥使它们在设计之前工作。GoF,p219”
实际上,当您拥有现有代码时,适配器模式非常有用,无论是第三方代码,还是内部代码,但不在您的控制范围之内,或者无法更改以完全满足您所需的接口。例如,我们有一个可以控制一系列末日设备的SuperWeaponsArray。
public class SuperWeaponsArray {
/*...*/
public void destroyWorld() {
for (Weapon w : armedWeapons) {
w.fire();
}
}
}太棒了。除非我们意识到我们的武器库中有一个核装置,它在转换到武器接口之前就已经存在了。但我们真的希望它能在这里工作。那我们该怎么做..。把它塞进去!
基于NukeWeaponsAdaptor的我们的Nuke类,但导出武器接口。甜心,现在我们肯定可以毁灭世界了。这看起来有点杂乱无章,但它能让事情变得更好。
桥模式是您预先实现的东西-如果您知道您有两个正交的层次结构,它提供了一种将接口和实现解耦的方法,这样您就不会获得大量的类。假设你有:
文件对象的MemoryMappedFile和DirectReadFile类型。假设您希望能够从各种来源读取文件(可能是Linux与Windows实现,等等)。Bridge可帮助您避免出现以下问题:
MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile
发布于 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模式将允许您可能拥有算法或系统的替代实现。
虽然不是一个典型的桥接模式示例,但想象一下,如果您有几个数据存储的实现:一个在空间上高效,另一个在原始性能上高效……并且您有在您的应用程序或框架中提供这两者的业务案例。
对于你的问题,“我可以在哪里使用哪种模式”,答案是,只要对你的项目有意义的地方!也许可以考虑提供一个澄清编辑,以指导讨论您认为需要使用其中一个或另一个。
发布于 2016-02-11 00:04:41
适配器:
非常有用
UML图:来自dofactory文章的:

目标:定义客户端使用的特定于域的接口。
适配器:使接口适配器适应目标接口。
Adaptee:定义需要适配的现有接口。
Client:与符合目标接口的对象协作。
示例:
正方形和矩形是两种不同的形状,获取它们各自的area()需要不同的方法。但Square仍然在矩形界面上工作,并转换了一些属性。
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();相关帖子:
When do you use the Bridge Pattern? How is it different from Adapter pattern?
的主要区别:与sourcemaking文章
https://stackoverflow.com/questions/1425171
复制相似问题