(根据MSDN Webcast相关课程整理)
由俄罗斯套娃讲起。娃娃里又包含另一个娃娃,最后那个不包含任何娃娃。
组合模式,采用树型结构来实现普遍存在的对象容器,将本原一对多的复杂的关系,转换成一对一的简单关系,从而可以一致的处理一批对象,使得客户程序不需要关心对象内容的具体实现。
将客户程序与对象内部实现解耦,是组合模式的核心思想。解耦后,客户程序只能对象上层的接口发生关系。
一种不好的设计方案:
把一对多的关系暴露给外界,客户程序即要处理一对一的关系,又要处理一对多的关系。
改进之后的方案,采用Composite设计模式:
提升容器对象特有的方法到父类中,从面确保客户程序可以采用一致的方案来处理对象。另外,在Process方法中完成两件事:
1, 完成自身的处理事务;
2, 循环处理所包含的子对象中的事件。
这就将原来在客户程序中递归调用的任务转移到了对象内部的循环调用。大大减少的耦合关系和代码的复杂度。
注:示例代码中使用了Add与Remove方面来完成对包含成员的操作,推荐使用UML图中的方法:使用IList来管理对象,从而自动实现Add与Remove等操作方法。
常见的类似结构的菜单,窗口,以及ASP.Net中的控件结构等。