2010-09-18 47 views
4

我正在尋找一些關於哪些設計模式用於我的問題的想法,無論語言如何。三種類似的API - 最佳設計模式?

我正在訪問三個具有不同接口和功能的API,但都是爲了相同的目的,以統一的方式向我返回有關同一類內容的信息 - 博客作者。

一些API完全符合我的要求,有些API需要API +屏幕抓取等等。

明顯的選擇似乎是適配器模式,但我想真正深入到這件事的設計,因此您的想法將不勝感激!

爲了清楚起見,現在我設想每個Web服務都有一個類,它們都執行基本的API以及不太優雅的東西。我想它然後返回一致的結果到它的適配器。我想象的是Adapter採用搜索之類的方法,然後將其路由到API中適當的方法,並找回結果,無論調用哪個服務,結果都是一樣的。

如果這聽起來像一個家庭作業,它是 - 但它是我分配給自己,以學習一些很酷的設計模式的東西。適配器是否正確?任何其他不錯的選擇?

提前致謝!

更新:雖然Adapter和Facade模式在我看來有很多相似之處,但PawełDyda指出,我所描述的實際上並不是Adapter,而是Facade。我同意。假設隨着時間的推移越來越多的API,有沒有人認爲比Facade有更好的選擇?

再次感謝。

回答

3

適配器是一種設計模式,可以將現有的API改編爲其他現有的API。你所指的實際上是Façade,是的,它似乎是一個很好的方式。

0

鴨子類型,爲每個類添加一個getAuthorInfo()方法可能會添加一個接口,但可能不是必要的。

過早抽象是萬惡之源。

+1

我傾向於不同意。一切都取決於項目的大小。如果他知道該項目將在規模上演變成一些怪物,那麼實際上需要抽象化並應該徹底使用。 – 2010-09-18 17:27:39

+0

謝謝兩位!我現在正在研究Facade。 – user277127 2010-09-18 17:32:28

2

我不認爲你需要立面或適配器模式。這在我看來是具有多個具體實現的接口的簡單情況。例如:

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(); 
     } 
     // ... 
    } 
} 
+0

我有點希望有人會建議工廠。我會認真考慮你的方法。謝謝。 – user277127 2010-09-18 19:16:49

0

聽起來像門面模式。將第三方api界面封裝在代碼的其餘部分之外總是一個好主意。下一步至少閱讀GoF Pattern圖書。它以清晰的軟件工程師的方式描述了大多數模式。

+0

謝謝。 Facade開始看起來像一個不錯的選擇。 – user277127 2010-09-18 19:17:59