C# 给定增量合成的类,我如何用一些设计模式实现替换它们,同时只定义一次方法体?
我不认为设计模式可以在这种意义上使用。 案例场景中有一个基本对象,该对象具有这些属性和始终定义的相应getter/setter:(id、name、content)。除此之外,还有一些对象具有可选属性和相应的getter/setter(注释、作者、删除)。 我希望这些对象为API提供我所需要的确切属性/方法 一种方法是把所有的东西都放在一个状态膨胀的类中C# 给定增量合成的类,我如何用一些设计模式实现替换它们,同时只定义一次方法体?,c#,expandoobject,expando,C#,Expandoobject,Expando,我不认为设计模式可以在这种意义上使用。 案例场景中有一个基本对象,该对象具有这些属性和始终定义的相应getter/setter:(id、name、content)。除此之外,还有一些对象具有可选属性和相应的getter/setter(注释、作者、删除)。 我希望这些对象为API提供我所需要的确切属性/方法 一种方法是把所有的东西都放在一个状态膨胀的类中 class Article { int id; int name; String content; List&l
class Article {
int id;
int name;
String content;
List<Comment> comments;
Author author;
bool deleted;
//getters and setters omitted
}
对于deletedarticlewithauthor和comments
,我想要如下内容:
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反射)——但我不知道这是否是一个好的做法
Edit2:我也在考虑匿名类,并以某种方式将实现作为lambda函数传递??(Java现在支持lambda函数),但同样,接口中的所有内容都必须实现:(
Edit3:有人指出要使用Expando对象,所以我相应地修改了问题,因为没有设计模式来完成这项工作。Java替代模式可以是:当某些基类型的不同实现可以嵌套在另一个基类型中时,使用装饰器模式,并且当调用一个方法时,会得到方法结果通过调用所有嵌套对象的相同方法来实现。例如,假设您有一个coffee类,您还可以向您的咖啡中添加调味品。可以向咖啡中添加单摩卡,也可以向咖啡中添加双摩卡或奶油。每种调味品的价格不同,您不知道将在手前向咖啡中添加什么调味品。然后,您可以使用装饰图案。你可以用调味品装饰咖啡,当你调用成本法时,你将得到总成本,即咖啡价格加上所有调味品。(顺便说一句,这个例子来自Head First Design Patterns book,如果你没有这样做,我建议你读这本书)
你的情况不是这样的。我认为你可以只使用一个字典。在每个类中,用适合该类的所有属性初始化字典。你要找的基本上是c#的类型和s。你可以在运行时创建一个你想要的类型 例如:
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。但它实际上只是语言可以支持的东西,而不是设计模式。我认为PHP最接近于分部类的是。我个人不使用分部类,但它们可能会对您的需求有所帮助。对我来说,创建
Article
class作为域模型似乎更好,在需要时附加其他类集合,如注释。还有,这是我吹毛求疵的地方,有没有像没有作者的文章这样的东西?有趣的是,我会看看Traits!这些字段是完全组成的。似乎对于Traits,我仍然必须定义所有的属性类是否正确?@cracketastic您也可以将Article视为不包含Author的DTO对象;)为什么不使用字典呢。并在每个类中用所需的状态初始化字典,并使用适合该类的内容。创建2^3个接口,创建一个实现所有接口的类。每个操作都可以是从一个接口映射到另一个接口的扩展方法。但我不确定我会推荐它,因为它不能扩展到很多不同的属性。
Article article = new MergerForArticle();
article.add(CommentForArticle.class);
article.add(DeletedForArticle.class);
article.add(AuthorForArticle.class);
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);
}
}