2008-12-11 22 views
1

我在尋找特定的設計模式。另一個類中的方法的設計模式

例如,我有一個文章類,clsArticle。該類包含成員變量,如Id,標題,作者,文章等。想象一下,我想顯示列表中的所有文章。所以我必須創建一個方法getAllArticles()。由於clsArticle不負責獲取所有文章,我必須將此方法放在另一個類中,clsArticleFact(其中Fact代表工廠)。

有人知道如何調用這種模式嗎?這是一種設計模式嗎?

回答

3

Yeap。這是正確的。

它可以是AbstractFactory或DataAccessObject。

第一種是當你想讓實現返回不同體裁的文章

例如假設您擁有的物品與平臺根據不同行爲的條件。

ArticleFactory.getAll(): Article[] 

會在每個平臺返回正確的列表。

的IMPL可能是:

WindowsArticleFactory 

OSXArticleFactory 

前者可用於抽象的,其中物品從檢索到的地方:

你可能有

ArticleDao.getAll(): Article[] 

個實現:

XmlArticleDao // Return a list of articles from an XML 

DatabaseArticleDao // return the list from the database. 

在這裏點是解耦從使用創建(GETALL())(文章)

如果你的應用是足夠的,你簡單可以使用factoryMethod來代替。

class Article { 
    static Article[] getAll() { 
     // do whatever is neede here... 
    } 
} 

我希望這有助於。

+0

感謝您的回答。我真的不明白。我正在用C#編程。我有一個文章類型。 – Martijn 2008-12-11 09:55:34

+0

@Martijn:OT:如果你使用C#編程,你不應該使用任何前綴(比如你的clsArticle),你不應該縮寫任何東西(比如你的* Fact)。查看.NET Framework中的命名指南,這將有利於任何人回答您未來的C#問題。 – OregonGhost 2008-12-11 10:03:29

+0

這適用於任何OO lang。事實上,你不需要那麼多的靈活性。最後一個選項(使用類方法)對你來說已經足夠了。但是,如果您想要將所有這些操作放在單獨的類中,您可能仍稱爲ArticleFactory。這個概念仍然是sam – OscarRyz 2008-12-11 16:38:06

0

好,創建一個靜態類用於此目的:

public static class clsArticles 
{ 
    public static clsArticles[] GetAllArticles() { /* actual code */ } 
} 
+0

爲什麼一個靜態類? – Martijn 2008-12-11 10:04:11

+0

因爲目前該類的唯一目的是提供對靜態方法的訪問。 – Claymore 2008-12-11 10:07:34

1

您還可以使用Rails的ActiveRecord的模型類所採取的做法

public class clsArticle 
{ 
    public static clsArticle[] findAll() { /*... */ } 

    // the other regular code here; 
} 

// client code 
foreach(clsArticle obArticle in clsArticle.findAll()) 
{ 
    list.add(clsArticle) 
} 
0

你描述的是不是一個真正的模式,但而是一種名爲'分離問題'的編程原則。

從你的描述,我強烈認爲,您的結構設計模式後,不是造物設計模式,因爲編碼的擔憂分配在造物共謀討論。

所以,我最好的猜測是,你以後的模式也許是外觀模式網關。使用實體(您的clsClass)和網關是很常見的。

但是,我並不一定會鼓勵跳到使您的方法變爲靜態,但從那時起,這些在業務邏輯測試期間不會被模擬。如果業務邏輯依賴於這些網關/外牆,當您不想在數據庫中點擊數據庫時,您會想要嘲笑這些返回數據訪問對象的方法(如果它們形成應用程序的數據層)。

public class clsClass 
{ 
    public int ID; 
    public string title; 
    public string author; 
    public string article; 
} 


public class BookGateway 
{ 
    public List<clsClass> GetAllArticles() 
    { 
     var result = new List<clsClass>(); 

     // Add items here. 
     // Can call database and populate each new clsClass 
     // and add to result object. 

     return result; 
    } 
} 
0

不要創建靜態方法!

您首先想到的應該是接口

也許你可以寫類似的信息(例如在Java中)

public interface ArticleService { 
    Article[] getAllArticles() throws ServiceException(); 
} 

你需要做的文章還進入這個界面中的所有其他的事情。將該類的具體實現(DbArticleService,XmlArticleService,...)注入到需要處理文章的每個對象中。

就像其他海報中提到的那樣,你可以得到解耦的代碼和很好的關注點分離。

但無論你做什麼,都不要讓東西靜止。

相關問題