Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计模式使用_C#_Design Patterns_Decorator_Strategy Pattern - Fatal编程技术网

C# 设计模式使用

C# 设计模式使用,c#,design-patterns,decorator,strategy-pattern,C#,Design Patterns,Decorator,Strategy Pattern,我的设计如下: 我创建了一个包含属性的类(比如一个非常大的数组) 稍后,当我解析文件时,我希望根据上述属性的内容添加一些“额外参数/功能” 最好的解决方案是什么 派生具有额外参数/功能的类(问题:需要将大数组复制到新类) 装饰图案?或者装饰器不是用来添加额外的属性/函数的吗 战略模式?因为我需要的属性可能不可用 另一个解决方案 您可以为附加值创建一个类,向数组中添加一个实例,当您需要新值时,可以将它们设置为给定对象。为什么派生类需要父类中的值的副本?继承的要点是不需要复制代码。您也可以尝试组

我的设计如下:

  • 我创建了一个包含属性的类(比如一个非常大的数组)
  • 稍后,当我解析文件时,我希望根据上述属性的内容添加一些“额外参数/功能”
最好的解决方案是什么

  • 派生具有额外参数/功能的类(问题:需要将大数组复制到新类)
  • 装饰图案?或者装饰器不是用来添加额外的属性/函数的吗
  • 战略模式?因为我需要的属性可能不可用
  • 另一个解决方案

  • 您可以为
    附加值创建一个类
    ,向数组中添加一个实例,当您需要新值时,可以将它们设置为给定对象。

    为什么派生类需要父类中的值的副本?继承的要点是不需要复制代码。您也可以尝试组合而不是继承。。。新类可以包含现有类的实例,而不是成为现有类的实例,前提是该实例在概念上适用于正在建模的数据。(我想这相当于装饰,取决于你如何建模。)我不确定策略在这里是如何应用的,因为这是针对算法而不是数据模型的,除非你对对象的描述是不完整的…@David原因是原始的(父)在检查是否需要派生类(实例)之前,类已创建。但是关于decorator部分,您所说的是一个很好的观点,我认为我使用这种方式(或者尝试它的工作方式)。因为您似乎希望“基于上述属性的内容”组合类,所以装饰是允许这种动态组合的解决方案。继承意味着你必须选择合适的派生,而不知道你实际上需要哪一个派生。啊,在这种情况下,如果不知道更多的话,那么Decorator无疑是一种选择。新对象只是简单地包装旧对象并将一些功能委托给它。你有多想模糊这个代表团取决于你。这也很符合“重组合轻继承”的概念,我相信这是《四人帮》一书中的建议。@David谢谢,看起来装饰图案确实是最好的。。。如果您可以将其添加为答案,我可以确认这一点(如果您愿意)。感谢您的回答,但我希望类属性可以从这两个对象(普通对象和“附加”对象)中获得。这可能最像@David已经解释过的decorator模式(可能的答案仍然是+1)。数组包含额外的对象,所以你可以通过它的数组到达普通对象的额外对象。我想我还不清楚。。。。数组包含字节,附加对象应该是具有自己的方法和属性的单独对象。“在OO中,不使用属性/函数的类,但仍然存在,这不是一个好主意。”需要时使用附加对象,并将null作为默认值。实现另一个具有额外成员的类并来回转换对象太困难了。您将使用太多的资源来遵守抽象OOP规则。我相信你会在实践中牺牲太多。是的,装饰解决方案也是可行的。