2010-04-30 38 views
0

我正在建立图表。一张图由相互链接的节点组成(实际上我亲爱的)。 为了给每个节点分配一个给定的行为,我实现了策略模式。影响表演的类型反射战略模式?

class Node { 
    public BaseNodeBehavior Behavior {get; set;} 
} 

因此,在应用程序的很多部分,我广泛使用类型反射来知道节点是哪种行为。

if (node.Behavior is NodeDataOutputBehavior) 
    workOnOutputNode(node) .... 

我的图可以得到数千个节点。

  • 是类型反射对性能有很大影响吗?
  • 我应该使用其他策略模式吗?

我使用策略,因为我需要行为继承。例如,基本上,行为可以是数据或操作员,数据行为可以是IO,Const或Intermediate,最后IO行为可以是输入或输出。因此,如果我使用枚举,我不能测试节点行为是数据类型,我需要测试它是[输入,输出,常量还是中级]。如果后来我想添加另一种Data类型的行为,那我就搞定了,每个数据测试方法都需要改变。

回答

2

if (node.Behavior is NodeDataOutputBehavior)不是反射,速度非常快。

+0

+1谢谢你,帮了不少忙! :-) – 2010-04-30 09:12:23

+0

我会说这是类型反射/类型识别... 无论如何,这不是一个好的面向对象设计。如果可能,你应该使用多态。例如。如果您基于节点类型打印节点,则应该将打印添加到节点接口,并让所有节点都实现该接口,但每种具体类型/策略都是这样。 – 2010-04-30 10:23:11

+0

我开始我的应用程序通过使用多态与节点,有一个DataNodes,DataIONodes等等等......但我想要从DataIntermediate节点更改为DataOutput?它的一团糟,每个父母/孩子必须交换一个新节点,必须复制属性等等。这就是为什么策略模式代表:能够轻松地改变对象行为。 – 2010-04-30 11:09:01

0

对不同节点行为使用访问者模式将删除类型检查。不过,我会这样做,以获得更清洁的设计,而不是性能,因为我怀疑会有任何显着的性能差异。

如果在编译时节点行为的类型是静态的,那么访问者模式工作得很好。当您添加新节点行为时,您会向Visitor接口添加一个新方法,这意味着编译器会捕获未处理该行为的情况。

通过临时类型检查,您必须手动检查代码以确定需要为新行为类型添加新处理程序的位置。