我正在寻找特定的设计模式。
例如我有一个文章类clsArticle。此类包含成员变量,如Id,title,author,article等。想象一下,我想在列表中显示所有文章。所以在某个地方我必须创建一个方法getAllArticles()。由于clsArticle不负责获取所有文章,我必须将此方法放在另一个类clsArticleFact(Where Fact代表Factory)。
有人知道如何调用此模式吗?这种工作方式是设计模式吗?
答案 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)
好吧,为此目的创建一个静态类:
public static class clsArticles
{
public static clsArticles[] GetAllArticles() { /* actual code */ }
}
答案 3 :(得分: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;
}
}
答案 4 :(得分:0)
不要创建静态方法!
您的第一个想法应该是界面。
也许你可以写一些像(Java中的例子)
public interface ArticleService {
Article[] getAllArticles() throws ServiceException();
}
您需要处理文章的所有其他内容也会进入此界面。将此类的具体实现(DbArticleService,XmlArticleService,...)注入到需要处理文章的每个对象中。
这样,正如其他海报所提到的那样,你会得到解耦的代码和很好的关注点分离。
但无论你做什么,都不要让东西变得静止。