我正在寻找一些关于哪种设计模式用于我的问题的想法,无论语言如何。
我正在访问三个具有不同接口和功能的API,但它们都是为了相同的目的,以统一的方式向我返回有关同一类内容的信息 - 博客作者。
有些API完全符合我的要求,有些API需要API + Screen Scraping,等等。
显而易见的选择似乎是适配器模式,但我想真正深入研究这个东西的设计,因此您的想法将不胜感激!
要完全清楚,现在我设想每个Web服务有一个类,它既可以执行基本API,也可以执行不太优雅的内容。我想它然后将均匀的结果返回到它的适配器。我想适配器采用类似Search的方法,然后将其路由到API中的相应方法,并获取结果,无论调用哪个服务,结果都是相同的。
如果这听起来像是家庭作业,那就是 - 但这是我为了学习一些很酷的设计模式而给自己分配的。适配器对吗?还有其他好的选择吗?
提前致谢!
更新:虽然适配器和Facade模式在我看来有很多相似之处,但PawełDyda在下面指出我所描述的实际上是Facade而不是Adapter。我同意。有人认为有一个比Facade更好的选择,假设随着时间的推移越来越多的API?
再次感谢。
答案 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书。它以清晰的软件工程方式描述了大多数模式。