观察以下课程及其收容:
Section
有一个ItemList
,其中有Item
个
但是让我们说Item
基于一些复杂的算法呈现不同的颜色,该算法基于它所包含的Section.name
。
抽象此功能的正确/最佳方法是什么?在这样的情况下是否存在常见的设计模式?或者固有的设计存在缺陷?
答案 0 :(得分:1)
您应该将数据结构/模型与逻辑和处理分开。也就是说,当您向Section
添加Section
时,我会让您的项目引用Item
引用ItemList
,确保添加方法查看ItemList
s Section
(父级),并在Item
上设置引用。同样适用于ItemList
中Section
的设置者,它必须迭代每个Item
并设置Section
。
或者,您可以将Section
的get ItemList
设置为惰性语义,这完全取决于您Section
性能统计信息的使用情况这两种方法会有所不同。
此外,我会写一些形式的渲染器,它使用Item
并知道如何渲染它,它会查看Section
和Item
上的Name
在Section
上。
您可能希望渲染整个部分,但我会将该渲染器分开编写,并使用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
处理渲染。