【问题标题】:What is the best way to implement the adaptor pattern in c++在 C++ 中实现适配器模式的最佳方法是什么
【发布时间】:2017-07-27 21:37:55
【问题描述】:

我已经看到可以使用继承,例如:

class A {
};

class Legacy{
};

class B : public A, private Legacy {
};

但是从两个不同的类继承公共和私有对我来说很奇怪。是否有其他方法来实现适配器模式?

【问题讨论】:

  • 为什么奇怪?
  • 因为我要从定义上非常不同的两个结构继承,我需要同时为它们实现一个行为。
  • 有一个学派说:“避免在 C++ 中使用多重继承。”
  • 这是@Ron 的重点,但适配器模式对我来说仍然很有吸引力。但是我害怕由于多重继承而将来会遇到的问题(耦合)。

标签: c++ design-patterns adaptor


【解决方案1】:

通常最好对适配器使用组合而不是继承(以及许多其他情况):

class B : public A {
  public:
    /* implementation of abstract methods of A with calls to Legacy */

  private:
    Legacy m_leg;
};

【讨论】:

  • 对我来说看起来很合理,但我不止一次阅读了用 MI 解释的适配器模式,并认为我可能错了。谢谢。
【解决方案2】:

这里您使用的是类适配器。使用 Adapter 本身就是一种折衷方案(当我们无法控制 Legacy Adaptee 但仍想使用它时,我们会使用 Adapter)。出于特定目的(匹配所需和提供的接口),我们强制适配器从 Adaptee 以及 Target 继承。由于这样的适配器类(遭受多重继承)不是跨应用程序的可重用域类,它只是一个(AKA)包装类。它与 Adaptee 和 Target 的“IsA”关系是强有力的,而不是自然地来自域模型。

即使如@dlasalle 所指出的那样,通过组合使用对象适配器将使其使用更加安全。但选择取决于两种类型之间的权衡。例如如果适配器的 80% 功能是由适配器按原样发布的,那么类适配器是避免为所有这些 80% 编写包装器方法的好选择。 C++ 实现可以选择使用 Java 所没有的类适配器(需谨慎)。

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多