2013-06-04 59 views
0

我現在正在開發一個圖像二值化庫,並且在這個庫中將實現經典的二值化方法,如Sauvola和Otsu方法。現在我的問題是如何優雅地設計圖書館。對於現在而言,我有兩個解決方案:圖像二值化庫的設計模式

解決方案1:

class Binarization 
    { 
    public: 
     BiinterfacePtr interface_; 
     enum BinarizationMethods 
     { 
      Method1, Method2, Method3, Method4 
     } 
     void set(BinarizationMethods method, Image *p_in, Image *p_out, Binarizationpara &para) 
     { 
      if (method == Method1) 
      { 
       BiinterfacePtr interfacetemp(new BinarizationMethod1()); 
       interface_ = interfacetemp; 
      } 
      if (method == Method2) 
      { 
      BiinterfacePtr interfacetemp(new BinarizationMethod2()); 
       interface_ = interfacetemp; 
      } 
      .... 
     } 
     bool run() 
     { 
      interface_->run(); 
     } 
     Image* output() 
     { 
      return interface->output(); 
     } 
} 

正如你所看到的,不同的二值化方法的實現在Biinterface類完成。當我們使用Binarization類時,我們可以通過調用set方法來表示我們想要使用的方法。但是,不同的二值化方法可能會有不同的參數設置,Binarizationpara的結構將變得複雜。

解決方案2

class BinarizationMethod1() 
{ 
    public: 
    perform_binarization(Image *p_in, Image *p_out, BinarizationMethod1Para &para); 
} 

class BinarizationMethod2() 
{ 
    public: 
    perform_binarization(Image *p_in, Image *p_out, BinarizationMethod2Para &para); 
} 

我的問題是哪一個更好。有關設計圖書館的想法將受到歡迎。謝謝!

+0

你可能尋找的工廠模式(你有一個相當簡陋的實施)。各種構造函數簽名之間會有多少變化? – alrikai

+0

@alrikai感謝您的評論。取決於所採用的二值化方法,構造函數簽名是相當不同的。我認爲Shinosha提供了一個很好的解決方案。 – feelfree

回答

2

我會用一個簡單的strategy pattern,這看起來像你的第一個解決方案,只有我會使用構造函數注入。我真的不明白爲什麼要使用枚舉,它是緊密耦合的,而不是維護應用程序的最佳方式。你可以直接將你想要的方法傳給你的二值化模塊。如果你需要傳遞參數給你的方法,只需使用它們的run方法(當然,如果它們都具有相同的參數,那麼你可以使用方法構造函數)。而且這使得新方法的創建和維護變得簡單。

Strategy pattern for Binarization

例如,你可以做:

Binarization binarization(new SauvolaMethod()...); 
binarization->run(); 

免責聲明:我不是一個C++傢伙

+0

沒關係任何人都沒有 – dchhetri

+0

隨着uml和所有,好工作=) – Eric