另一个类中方法的设计模式

时间:2008-12-11 09:38:51

标签: design-patterns oop

我正在寻找特定的设计模式。

例如我有一个文章类clsArticle。此类包含成员变量,如Id,title,author,article等。想象一下,我想在列表中显示所有文章。所以在某个地方我必须创建一个方法getAllArticles()。由于clsArticle不负责获取所有文章,我必须将此方法放在另一个类clsArticleFact(Where Fact代表Factory)。

有人知道如何调用此模式吗?这种工作方式是设计模式吗?

5 个答案:

答案 0 :(得分:3)

叶氏。那是对的。

它可以是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...
     }
 }

我希望这会有所帮助。

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

答案 2 :(得分:0)

不要创建静态方法!

您的第一个想法应该是界面

也许你可以写一些像(Java中的例子)

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

您需要处理文章的所有其他内容也会进入此界面。将此类的具体实现(DbArticleService,XmlArticleService,...)注入到需要处理文章的每个对象中。

这样,正如其他海报所提到的那样,你会得到解耦的代码和很好的关注点分离。

但无论你做什么,都不要让东西变得静止。

答案 3 :(得分:0)

好吧,为此目的创建一个静态类:

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

答案 4 :(得分:0)

你所描述的并不是一种模式,而是一种称为“关注点分离”的编程原则。

根据你的描述,我强烈认为你是在结构设计模式之后,而不是创造性的设计模式,因为编码问题的分配是在创造性的共谋中讨论的。

所以,我最好的猜测是你所追求的模式可能是 Facade Pattern Gateways 。通常将实体(您的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;
    }
}
豫ICP备18024241号-1