你会如何抽象这个功能?

时间:2012-08-29 19:09:48

标签: oop design-patterns

观察以下课程及其收容:

Section有一个ItemList,其中有Item

但是让我们说Item基于一些复杂的算法呈现不同的颜色,该算法基于它所包含的Section.name

抽象此功能的正确/最佳方法是什么?在这样的情况下是否存在常见的设计模式?或者固有的设计存在缺陷?

3 个答案:

答案 0 :(得分:1)

您应该将数据结构/模型与逻辑和处理分开。也就是说,当您向Section添加Section时,我会让您的项目引用Item引用ItemList,确保添加方法查看ItemList s Section(父级),并在Item上设置引用。同样适用于ItemListSection的设置者,它必须迭代每个Item并设置Section

或者,您可以将Section的get ItemList设置为惰性语义,这完全取决于您Section性能统计信息的使用情况这两种方法会有所不同。

此外,我会写一些形式的渲染器,它使用Item并知道如何渲染它,它会查看SectionItem上的NameSection上。

您可能希望渲染整个部分,但我会将该渲染器分开编写,并使用ItemRenderer渲染每个Item

顺便说一句,您可能希望使用IObservableCollection的形式并且Item实现INotifyPropertyChanged,以便您可以在呈现的版本和item,并通过适当更新Item属性的事件注册将Section与其所存在的Section同步。

答案 1 :(得分:0)

渲染是什么?如果它在Section中,或者在所有这些内容之外,但是从Item访问Section,那么就没有必要了。

如果它在Item中,那么您只需要确保Item知道它所属的Section,或者可以获取它(例如,通过拥有可以查找的ID - 对于使处理循环引用变得棘手的语言很有用,但其他麻烦则不然。)

由于第一种情况没有任何困难,因此显然优于第二种情况,因此最接近设计模式的是,如果您发现自己在所包含的项目中进行此类工作,则尝试将其移动到容器,或在它们之外。除此之外,没有太多问题需要解决。

答案 2 :(得分:0)

我会构建一个知道该算法的ItemRenderer类,并将对您想呈现的每个Item的引用传递给它,并将Section包含在其中。

让每个Item知道它所属的部分也是有意义的,但我仍然会让ItemRenderer处理渲染。