C#设计模式学习4——合成模式
合成模式
主要在于定义一个接口,使之可以用于单个对象,也可以应用于相关的对象组。也就是说,对象组和单个对象需要执行相同的方法,且对象组就是改种单个对象的集合。
需要注意的是,合成对象既可以包含对象组,也可以包含单个对象。单个对象和对象组应该定义一个公共的行为方法来完成相同的任务。
合成模式在设计时主要对应树形结构的数据结构。在底层数据结构采用树形来设计时,我们就可以考虑使用合成模式来设计程序代码。树结构中每个叶节点对应合成模式中单个对象,而树的任何一段和整个树则对应合成模式中的对象组。
因为对象组可以包含另外的对象组以及单个对象,因此合成模式在实现时大多采用递归的方法。
在实际应用中,我曾碰到过这么一个应用:设置得分项。
每个得分项又分别由其他几个得分项组成,依次往下推。得分项的组成深度又实际情况决定。在汇总分数时,就必须由叶子得分项开始计算,依次往上汇总,最后计算出总得分。
在这中间应用到了合成模式的设计,规定了每个叶子节点的需要实现的方法接口,从而整个得分项树也要实现这些方法,最后汇总得出总分。
合成模式也多用于同类数据的UI重构。
一个简单的合成模式代码:




























合成模式也能应用在图形的数据结构中。只是图形结构中,可能具有回路,从而应该在递归处理的方法中进行监视,检测节点的是否已经访问,从而避免出现死循环。
合成模式即一个对象组的合成,可以包含单个基本对象也可包含其他对象组,而对象组和单个对象共享一个公共接口,该接口定义了对象组和单个对象都具备的行为。
Difficulty of making decision depends on what to lose not gain