>[success] # 书中也给了四条组合模式注意点 ~~~ 1.'组合模式不是父子关系' 组合模式是一种 HAS-A(聚合)的关系,而不是 IS-A。组合对象包含一组叶对象,但 Leaf 并不是 Composite 的子类。组合对象把请求委托给它所包含的所有叶对象,它们能够合作的关键 是拥有相同的接口。 2.'对叶对象操作的一致性' 组合模式除了要求组合对象和叶对象拥有相同的接口之外,还有一个必要条件,就是对一组 叶对象的操作必须具有一致性。只有用一致的方式对待列表中的每个叶对象的时候,才适合使用组 合模式。 3.'双向映射关系' 发放过节费的通知步骤是从公司到各个部门,再到各个小组,最后到每个员工的邮箱里。这 本身是一个组合模式的好例子,但要考虑的一种情况是,也许某些员工属于多个组织架构。比如 某位架构师既隶属于开发组,又隶属于架构组,对象之间的关系并不是严格意义上的层次结构, 在这种情况下,是不适合使用组合模式的,该架构师很可能会收到两份过节费。 这种复合情况下我们必须给父节点和子节点建立双向映射关系,一个简单的方法是给小组和员 工对象都增加集合来保存对方的引用。但是这种相互间的引用相当复杂,而且对象之间产生了过多 的耦合性,修改或者删除一个对象都变得困难,此时我们可以引入中介者模式来管理这些对象。 4.'用职责链模式提高组合模式性能' 在组合模式中,如果树的结构比较复杂,节点数量很多,在遍历树的过程中,性能方面也许 表现得不够理想。有时候我们确实可以借助一些技巧,在实际操作中避免遍历整棵树,有一种现 成的方案是借助职责链模式。职责链模式一般需要我们手动去设置链条,但在组合模式中,父对 象和子对象之间实际上形成了天然的职责链。让请求顺着链条从父对象往子对象传递,或者是反 过来从子对象往父对象传递,直到遇到可以处理该请求的对象为止,这也是职责链模式的经典运 用场景之一。 ~~~