这仍然是实现从抽象派生的桥接模式吗?

Posted

技术标签:

【中文标题】这仍然是实现从抽象派生的桥接模式吗?【英文标题】:Is that still the bridge pattern where the implementation derives from the abstraction? 【发布时间】:2014-11-08 07:09:59 【问题描述】:

在提供不用于派生的公共 API 类时,我发现通过从它们派生而不是添加和实现桥来提供它们的实现更方便。

抽象的实现不必是可替换的。唯一的要求是将实现与抽象(公共接口)分开。

PublicApiAssembly.dll:

public abstract class PublicApi // Clients don't need to derive from it

    internal PublicApi() 
    public abstract void Calculate();

ImplementationAssembly.dll(引用 PublicApiAssembly.dll 和所有其他依赖项来实现抽象):

internal class PublicApiImpl : PublicApi

    public override void Calculate() 

请问这仍然是实现派生自抽象的桥接模式吗?

Wikipedia 在说“可以使用继承来分离职责”时让我认为这是桥接模式的实现。

谢谢!

【问题讨论】:

【参考方案1】:

桥接模式的要点是“将抽象与其实现分离,以便两者可以独立地变化”。 抽象可以通过继承而变化,而实现可以通过不同的实现而变化。这不再适用于您的设计。您故意决定抽象不会改变(“不用于派生的公共 API 类”)并通过继承将实现与抽象联系起来。所以恕我直言,这里没有足够的桥接模式来证明引用它是合理的。

附注:

唯一的要求是将实现与抽象(公共接口)分开。

为什么要将PublicApi 建模为抽象类而不是接口?根据我从您的问题中读到的内容,界面将更符合您的意图。

【讨论】:

公共 API 被声明为抽象类,因为 1. 在更高版本的库中,新成员可以安全地添加到类中;您不能在不破坏现有代码的情况下将成员添加到接口。 2. 合约(API)仅适用于一种类型,即其实现。通过将其声明为接口,我们可以传达合同可以由多种类实现,但事实并非如此。请参考 MSDN 上的Choosing Between Classes and Interfaces。

以上是关于这仍然是实现从抽象派生的桥接模式吗?的主要内容,如果未能解决你的问题,请参考以下文章

桥接模式(Bridge)

设计模式——桥接模式

设计模式--桥接模式

桥接模式:如何定义调用派生类实现的函数

桥接模式

18桥接模式