三个类似的API - 最佳设计模式?

时间:2010-09-18 17:14:18

标签: design-patterns api oop

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

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

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

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

要完全清楚,现在我设想每个Web服务有一个类,它既可以执行基本API,也可以执行不太优雅的内容。我想它然后将均匀的结果返回到它的适配器。我想适配器采用类似Search的方法,然后将其路由到API中的相应方法,并获取结果,无论调用哪个服务,结果都是相同的。

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

提前致谢!

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

再次感谢。

4 个答案:

答案 0 :(得分:3)

适配器是一种设计模式,可将现有API与其他现有API相匹配。你所说的,实际上是Façade,是的,这似乎是一个很好的方式。

答案 1 :(得分: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);
    }
}

使用这种类型的设置,您可以使用的一种设计模式是Factory模式。例如:

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

答案 2 :(得分:0)

Duck类型,为每个类添加一个getAuthorInfo()方法可能会添加一个接口,但这可能不是必需的。

过早的抽象是所有邪恶的根源。

答案 3 :(得分:0)

听起来像Facade Pattern。将第三方api接口封装在远离代码的其他部分的位置总是一个好主意。下一步至少阅读GoF Pattern书。它以清晰的软件工程方式描述了大多数模式。