【问题标题】:Adapter or Bridge in my specific situation?在我的具体情况下适配器或桥接器?
【发布时间】:2014-03-11 00:18:59
【问题描述】:

好吧,我正在创建一个库,该库需要采用所有其他库并让它们“相似”地工作。

例如:假设我有 5 个库,所有这些库都有相同的想法,工作于相同的案例,但它们有自己的工作方式,自己的 API,而我需要的是让它们工作使用单个 API。

我的想法是在工厂内部创建一个带有“信任列表”的“工厂”,允许用户选择不同的库来创建,“工厂”在“信任列表”上查看,如果该库确实存在,它创建并返回该库。

但它也可以使用接口来实现,我只能接受实现指定接口的类,我将获得我想要的方法实现的安全性,那么这是什么意思?所有的库都需要实现该接口,实现方法并对库进行封装,这样它们就可以使用相同的 API。用户可以使用工厂创建一个库,并对所有这些库使用相同的 API。

我不知道您是否理解我要解释的内容,但我想知道,根据我所说的,在我的情况下,“桥”或“适配器”模式最好的是什么?

另外,我的想法是正确的还是我疯了? (接口和工厂的东西,还有桥接器和适配器,告诉我你的想法)。

提前谢谢大家。

【问题讨论】:

  • 那么,这个库是用 Java、PHP 和 C++ 编写的吗?如果没有,请删除不相关的标签。
  • 没关系,这不是关于语言,而是关于“设计模式”,实现本身。
  • 那么请不要添加任何编程语言标签。
  • 问题是我放在标签上的所有语言都适用于 OOP。 - 那有什么问题? :)
  • 这不是 SO 的工作方式。您提出了一个特定的编程问题,这意味着您所针对的特定编程语言。当您针对多种编程语言时,您至少应该提供为什么要这样做的原因,并且说 因为它适用于所有语言 就像说 我不知道我在做什么正在做.

标签: api oop design-patterns adapter bridge


【解决方案1】:

桥接模式旨在将类的接口与其实现分开,这样您就可以在不更改客户端代码的情况下更改或替换实现。

我认为您可以指定公共非虚拟接口,然后在每个公共函数中使用模板方法调用实现方法。

class Basic {
public:
      // Stable, nonvirtual interface.
      void A { doA();}
      void B { doB();}
      //...
private:
      // Customization is an implementation detail that may
      // or may not directly correspond to the interface.
      // Each of these functions might optionally be
      // pure virtual
      virtual void doA { impl_ -> doA();}
      virtual void doB { impl_ -> doB();}
};

这些讲座可能有用:

Bridge pattern

Template method

【讨论】:

  • 我想,也许我可以创建一个接口“Adapter”,实现我想要的所有API,并为每个库创建一个实现“Adapter”的类,例如:“AAdapter”,并接收“Adaptee”(我想使用 API 的库)作为构造函数的参数(实例),然后在该“桥”(AAdapter)上实现“Adapter”的方法。我对吗?谢谢。
  • 没错,你会以 Adapter myA(AAdapter), Adapter myB(BAdapter) 之类的东西结束
  • 我看了一篇关于桥接器和适配器模式的教程,那个人解释了我为你说的话,但我在 Code Project 上找到了一个很好地解释了这一点的教程:codeproject.com/Tips/595716/Adapter-Design-Pattern-in-Cplusplus
  • 重要的是你在你的基础上调用一个构造函数,并以一个实现作为参数
  • 是的,这就是我写的。由于很多原因,我会这样做。谢谢。
【解决方案2】:

对我来说听起来像是适配器。您有多个适配器实现,这是基本的多态性,每个适配器都知道如何适应特定的库。

我看不出桥模式在这里有什么意义。您通常会在使用这些库的地方使用它,但您还不知道具体的库实现。

【讨论】:

    猜你喜欢
    • 2016-06-13
    • 2015-11-01
    • 2012-05-25
    • 2013-07-02
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2023-03-29
    相关资源
    最近更新 更多