桥接模式理解

8
我在一定程度上理解桥接模式。我了解接口和实现的解耦,它使用像插件一样的 实现者 类来保存派生类实现的真正逻辑。
但是,有人能解释一下它如何允许接口和派生类独立演化吗?如果我想向接口添加一个新方法,它将必须在派生类中进行实现,这会修改它。
此外,当需要新对象时,客户端代码必须被修改以设置新的 实现者

1
更适合发布在programmers.stackexchange.com上,因为它涉及程序理论而不是模式实现的具体问题。 - Burhan Khalid
3个回答

21

是的,桥接模式的意图是将抽象(即界面)与实现解耦,让它们能够独立变化。在实践中,想法是使用两个单独的层次结构,而不是经典的单一层次结构。

让我们举个例子。假设你有一个窗口抽象,你需要创建一个IconWindow子类,为每个支持的平台专门定制窗口。

使用单一层次结构,你会得到:

                     Window
                       |--------------...
                   IconWindow
                       |
   -----------------------------------------------...
   |                   |                   |
XIconWindow       MSIconWindow      OSXIconWindow

这个结构非常不方便,因为:

  • 如果您想添加一个专门针对 Window (例如,BitmapWindow)的新子类,则必须为每个支持的平台创建一个子类(在此示例中为三个子类)。

  • 如果要添加另一个支持的平台,则必须为每个现有专业化添加一个新子类。

因此,最好通过拥有两个层次结构来解耦:

             imp
      Window--------------------------> WindowImp
         |                                  |
    -----------....            ---------------------------------
    |                          |              |                |
IconWindow                XWindowImp      MSWindowImp    OSXWindowImp

WindowWindowImp是接口。 IconWindow使用Window提供的方法。 Window反过来会在imp上调用相关的方法。

WindowWindowImp之间的关系称为桥接模式

例如:IconWindow::DrawBorder()使用Window::DrawRect(),它调用了imp->DevDrawLine(),该方法在WindowImp中声明并在具体子类(例如XWindowImp类)中定义。

我的建议是阅读书籍:“Design patterns-Elements of Reusable Object-Oriented Software”(http://en.wikipedia.org/wiki/Design_Patterns),其中包含上述示例。


3
我认为Java JDBC API是阐述桥接设计模式使用者的最佳例子。客户端使用抽象层(JDBC API),而不必担心不同SQL供应商提供的实现(MYSQL、Oracle等)。
进一步说明,假设您有一个EmployeeDAOImpl,它实现了EmployeeDAO接口,并具有保存、更新和删除方法。现在,这个EmployeeDAOImpl将使用JDBC API(抽象层)执行CRUD操作,而不必担心使用的数据库。EmployeeDAOImpl需要的唯一东西就是加载驱动程序的URL。
现在关键的是,EmployeeDAOImpl和其他DAO的层次结构可以独立地变化。他们不必担心JDBI API抽象的实现。

请添加细节,说明JDBC如何实现桥接模式。 - Number945
@Atul 你认为EmployeeDAOImpl和JDBC之间的关系是HAS-A吗? - Victor

0

桥接模式:

  • 将抽象与其实现分离,使得两者可以独立变化;

  • 结构型模式;

  • 桥接模式是一种软件工程中使用的设计模式,旨在“将抽象与其实现分离,使得两者可以独立变化”。桥接使用封装、聚合,并可以使用继承将责任分配到不同的类中;

  • 当一个类经常变化时,面向对象编程的特性非常有用,因为可以轻松地进行程序代码的更改,而无需对程序有太多的先前了解。当类本身以及它所做的事情都经常变化时,桥接模式非常有用。类本身可以被视为实现,而类所能做的事情可以被视为抽象。桥接模式也可以被视为两个抽象层;

  • 桥接模式经常与适配器模式混淆。实际上,桥接模式通常使用类适配器模式来实现;

  • 变体:通过将实现的存在推迟到使用抽象的点,可以进一步解耦实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接