组合模式 - Composite Pattern
定义
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。
组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式。
设计的原则和思想
- 解耦的是客户程序与复杂元素内部结构。
- 不变部分是元素之间的层次结构,变化部分是元素。
- 核心思想是组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。
一句话概括设计模式
元素与元素之间形成“整体—部分”的层次结构。
结构中包含的角色
- Component(抽象构件)
- Leaf(叶子构件)
- Composite(容器构件)
最小可表达代码
abstract class Component | |
{ | |
public abstract function operation(); | |
} | |
class Leaf extends Component | |
{ | |
public function operation() | |
{ | |
echo '我是叶子'; | |
} | |
} | |
class Composite extends Component | |
{ | |
private $components = []; | |
public function add(Component $component) | |
{ | |
$this->components[] = $component; | |
} | |
public function operation() | |
{ | |
foreach ($this->components as $component) { | |
$component->operation(); | |
} | |
} | |
} | |
$composite = new Composite(); | |
$composite->add(new Leaf); | |
$composite->operation(); |
优点
- 节点自由增加。
- 可以利用多态和递归机制更方便地使用复杂树结构。
- 方便对整个层次结构进行控制。
缺点
- 叶子和树枝的声明都是实现类,违反了依赖倒置原则。
- 对于功能差异较大的类, 提供公共接口或许会有困难。
- 在增加新构件时很难对容器中的构件类型进行限制。
何时使用
- 具有部分-整体层次结构(树形结构)。
- 以相同方式处理简单和复杂元素。
实际应用场景
- 文件系统。
- 公司的组织结构。
- 在XML解析。