【问题标题】:Three Similar APIs - Best Design Pattern?三个类似的 API - 最佳设计模式?
【发布时间】:2010-09-18 17:14:18
【问题描述】:

我正在寻找一些关于使用哪种设计模式来解决我的问题的想法,无论语言如何。

我正在访问三个 API,它们具有不同的接口和功能,但都出于相同的目的,以统一的方式向我返回关于相同类型内容的信息——博客作者。

有些 API 完全符合我的要求,有些则需要 API + Screen Scraping,等等。

显而易见的选择似乎是适配器模式,但我想真正深入研究这个东西的设计,因此您的想法将不胜感激!

为了完全清楚,现在我设想每个 Web 服务都有一个类,它既可以做基本的 API 的事情,也可以做不太优雅的事情。我想它然后将统一的结果返回给它的适配器。我想适配器采用像 Search 这样的方法,然后将其路由到 API 中的适当方法,并返回结果,无论调用哪个服务,结果看起来都是一样的。

如果这听起来像是一项家庭作业,那就是——但这是我分配给自己的,目的是学习一些很酷的设计模式的东西。适配器对吗?还有其他好的选择吗?

提前致谢!

更新:虽然在我看来适配器和外观模式有很多相似之处,但 Paweł Dyda 在下面指出,我所描述的实际上是外观而不是适配器。我同意。假设随着时间的推移 API 的数量越来越多,有没有人认为有比 Facade 更好的选择?

再次感谢。

【问题讨论】:

    标签: design-patterns api oop


    【解决方案1】:

    适配器是一种将现有 API 适配到其他现有 API 的设计模式。您所指的实际上是 Façade,是的,这似乎是一个不错的选择。

    【讨论】:

      【解决方案2】:

      我认为您不需要 Façade 或适配器模式。在我看来,这似乎是一个具有多个具体实现的接口的简单案例。例如:

      interface IBlogApi
      {
          IBlog GetBlog(string url);
      }
      
      interface IBlog
      {
          AuthorInfo GetAuthorInfo();
      }
      
      class BloggerBlog : IBlog
      {
          public BloggerBlog(string url)
          {
              // ...
          }
      
          public AuthorInfo GetAuthorInfo()
          {
              // ...
          }
      }
      
      class BloggerApi : IBlogApi
      {
          public IBlog GetBlog(string url)
          {
              return new BloggerBlog(url);
          }
      }
      

      通过这种类型的设置,您可以采用的一种设计模式是工厂模式。例如:

      public class BlogFactory
      {
          public IBlogApi GetApiForUrl(string url)
          {
              // Dumb example...
              if (url.Contains(".blogger.com"))
              {
                  return new BloggerApi();
              }
              // ...
          }
      }
      

      【讨论】:

      • 我有点希望有人会推荐 Factory。我会认真考虑你的方法。谢谢。
      【解决方案3】:

      Duck 类型,为每个类添加一个 getAuthorInfo() 方法可能会添加一个接口,但这可能甚至没有必要。

      过早的抽象是万恶之源。

      【讨论】:

      • 我倾向于不同意。一切都取决于项目的规模。如果他知道项目在规模上会演变成某种怪物,那么实际上需要好的抽象并且应该彻底使用。
      • 谢谢两位!我现在正在研究 Facade。
      【解决方案4】:

      听起来像外观图案。将 3rd 方 api 接口封装在代码的其余部分之外总是一个好主意。下一步至少阅读 GoF 模式书。它以清晰的软件工程方式描述了大多数模式。

      【讨论】:

        猜你喜欢
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 2021-11-08
        • 2013-12-01
        • 2017-10-27
        • 1970-01-01
        相关资源
        最近更新 更多