一、 组件之间的关联关系
图一
上一篇有这样一幅图,Bootstrap类相当于是Tomcat的开关机模块,实际操作的是Catalina,而Catalina的核心组件由Server、Service等组成。
在前面的章节讲过,Tomcat的Server、Service等这些组件实际上是按照Server.xml文件的配置组合在一起的,包括它们之间的关联关系。以一个XML文档表示的关联关系、Server组件是root,这两点说明了什么?说明这些组件实际上是组成了一个“树”状结构。
这样的树状结构,每个节点又都实现了Lifeycle接口,这是典型的【组合模式】。
二、 ☆ 组合模式(COMPOSITE)
1. 概念与结构
组合模式是结构型设计模式之一。
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
-引用自:《设计模式:可复用面向对象软件的基础》
组合模式适用于这样的场景:可以由多个元素组成一个大的组件,就像多个Host组成Engine,而多个大小组件又可组成更大的组件,就像Engine和多个Executor组成Service。无论单一元素还是组合组件,都可以认为是一致的。
组合模式的结构如下图(引用自:《设计模式:可复用面向对象软件的基础》):
图二
2. 优点及使用场景
优点:
定义了包含基本对象和组合对象的类层次结构:基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去。在客户代码中,任何用到基本对象的地方都可以使用组合对象。
简化客户代码:客户可以一致地使用组合结构和单个对象。通常用户不知道(也不关心)处理的是一个叶节点还是一个组合组件。这就简化了客户代码,因为在定义组合的那些类中不需要写一些充斥着选择语句的函数。
使得更容易增加新类型的组件新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需因新的Component类而改变。
使你的设计变得更加一般化:可以很容易的增加新组件。 但这也会产生一些问题,那就是很难限制组合中的组件。有时你希望一个组合只能有某些特定的组件。使用组合模式时,你不能依赖类型系统施加这些约束,而必须在运行时刻进行检查。
场景:
系统的树状菜单、组织或部门的树状关系等。
常见的算法:
而伴随组合模式常用的算法就是递归,一般可以通过递归方式遍历树状的节点。