但是,有人能解释一下它如何允许接口和派生类独立演化吗?如果我想向接口添加一个新方法,它将必须在派生类中进行实现,这会修改它。
此外,当需要新对象时,客户端代码必须被修改以设置新的 实现者。
是的,桥接模式的意图是将抽象(即界面)与实现解耦,让它们能够独立变化。在实践中,想法是使用两个单独的层次结构,而不是经典的单一层次结构。
让我们举个例子。假设你有一个窗口抽象,你需要创建一个IconWindow子类,为每个支持的平台专门定制窗口。
使用单一层次结构,你会得到:
Window
|--------------...
IconWindow
|
-----------------------------------------------...
| | |
XIconWindow MSIconWindow OSXIconWindow
这个结构非常不方便,因为:
如果您想添加一个专门针对 Window (例如,BitmapWindow)的新子类,则必须为每个支持的平台创建一个子类(在此示例中为三个子类)。
如果要添加另一个支持的平台,则必须为每个现有专业化添加一个新子类。
因此,最好通过拥有两个层次结构来解耦:
imp
Window--------------------------> WindowImp
| |
-----------.... ---------------------------------
| | | |
IconWindow XWindowImp MSWindowImp OSXWindowImp
Window和WindowImp是接口。 IconWindow使用Window提供的方法。 Window反过来会在imp上调用相关的方法。
Window和WindowImp之间的关系称为桥接模式。
例如:IconWindow::DrawBorder()使用Window::DrawRect(),它调用了imp->DevDrawLine(),该方法在WindowImp中声明并在具体子类(例如XWindowImp类)中定义。
我的建议是阅读书籍:“Design patterns-Elements of Reusable Object-Oriented Software”(http://en.wikipedia.org/wiki/Design_Patterns),其中包含上述示例。
桥接模式:
将抽象与其实现分离,使得两者可以独立变化;
结构型模式;
桥接模式是一种软件工程中使用的设计模式,旨在“将抽象与其实现分离,使得两者可以独立变化”。桥接使用封装、聚合,并可以使用继承将责任分配到不同的类中;
当一个类经常变化时,面向对象编程的特性非常有用,因为可以轻松地进行程序代码的更改,而无需对程序有太多的先前了解。当类本身以及它所做的事情都经常变化时,桥接模式非常有用。类本身可以被视为实现,而类所能做的事情可以被视为抽象。桥接模式也可以被视为两个抽象层;
桥接模式经常与适配器模式混淆。实际上,桥接模式通常使用类适配器模式来实现;
变体:通过将实现的存在推迟到使用抽象的点,可以进一步解耦实现。