给定增量组合的类,我如何用一些设计模式实现来替换它们,同时只定义一次方法体



我不认为设计模式可以在这个意义上使用。案例场景是有一个基本对象,该对象具有以下属性,并且始终定义了相应的getter/setter:(id,name,content)。除此之外,还会有一些对象具有可选属性和相应的getter/setter(comments、author、deleted)。我希望这些对象能为API提供我所需要的精确属性/方法。

一种方法是将所有东西都放在一个具有状态膨胀的类中

class Article {
    int id;
    int name;
    String content;
    List<Comment> comments;
    Author author;
    bool deleted;
    //getters and setters omitted 
}

另一种是有多个类,但这会导致类名膨胀

class Article {
    int id;
    int name;
    String content;
    //getters and setters omitted 
}

class DeletedArticle : Article {
    bool deleted = true;
    //getters and setters omitted 
}

class ArticleWithAuthor : Article {
    Author author;
    //getters and setters omitted 
}

 class ArticleWithComments : Article {
    List<Comment> comments;
    //getters and setters omitted 
}

 class DeletedArticleWithAuthor : Article {
    bool deleted = true;
    Author author;
    //getters and setters omitted 
 }
 class DeletedArticleWithComments : Article {
    bool deleted = true;
    List<Comment> comments;
    //getters and setters omitted 
 }
 class DeletedArticleWithAuthorAndComments : Article {
    bool deleted = true;
    Author author;
    List<Comment> comments;
    //getters and setters omitted 
 }
 //AND SO ON... 

由于总是有(id,name,content)和三个可选变量的类的所有可能配置都是2^3,我想知道是否有一种方法可以用设计模式(希望没有反射)来实现这一点。请记住,我知道我可以使用更轻松的类型语言,或者只使用JSON/XML,但这不是重点:P。此外,我不熟悉分部类(来自C#),如果这是相关的话。

正如它所指出的,ExpandoObjects可能是一种方式。你能为ArticleWithCommentsDeletedArticleWithAuthorAndComments提供一个使用我自己的类的示例代码吗?这样就不需要定义它们了?

例如,对于ArticleWithComments,我希望有类似的东西

 Article article = new CommentsOnArticle(new Article());

对于DeletedArticleWithAuthorAndComments,我想要一些类似的东西:

 Article article = new AuthorOnArticle(new DeletedOnArticle(new CommentsOnArticle(new Article())));

或其他一些符号,如:

 Article article = new MergerForArticle();
 article.add(CommentForArticle.class);
 article.add(DeletedForArticle.class);
 article.add(AuthorForArticle.class);

换言之,我希望避免定义所有可能的类排列,只使用"动态类声明"

编辑:我也在考虑反射(例如Java Reflect)——不过我不知道这是否是一个好的做法。。

Edit2:我也在考虑匿名类,并以某种方式将实现作为lambda函数传递??(Java现在支持lambda函数),但接口中的所有东西都必须实现:(

第3版:有人指出要使用Expando对象,所以我相应地改变了问题,因为没有设计模式可以完成这项工作。Java替代可能是:https://svn.codehaus.org/groovy/branches/gep-3/src/main/groovy/util/Expando.java

您要查找的基本上是c#的dynamic类型和ExpandoObject类型。您基本上可以在运行时构建一个类型,使其成为您想要的任何类型。

例如:

class Program
{
    static void Main(string[] args)
    {
        dynamic sampleObject = new ExpandoObject();
        // Create a new event and initialize it with null.
        sampleObject.sampleEvent = null;
        // Add an event handler.
        sampleObject.sampleEvent += new EventHandler(SampleHandler);
        // Raise an event for testing purposes.
        sampleObject.sampleEvent(sampleObject, new EventArgs());
   }
    // Event handler.
    static void SampleHandler(object sender, EventArgs e)
    {
        Console.WriteLine("SampleHandler for {0} event", sender);
    }
}

当然,JavaScript也有类似的功能,因为您可以在运行时随意添加和删除类中的属性。

这种行为真的可以追溯到SmallTalk。但这实际上只是语言所能支持的东西。不是设计模式。

当某个基类型的不同实现可以相互嵌套时,使用Decorator模式,当调用一个方法时,通过调用所有嵌套对象的同一方法来获得方法结果。例如,假设你有一堂咖啡课,你也可以在咖啡中添加调味品。单摩卡可以加入咖啡、双摩卡或奶油中。每种调味品都有不同的价格,而且你不知道咖啡中会加入什么调味品。然后可以使用decorator模式。你可以用调味品装饰咖啡,当你调用成本法时,你会得到总成本,即咖啡价格加上所有调味品。(顺便说一句,这个例子来自Head First Design Patterns一书,如果你没有这样做,我建议你读一下)

你的情况并非如此。我想你可以用字典。在每个类中,使用适用于该类的所有属性初始化字典。

相关内容

  • 没有找到相关文章