组合模式 - 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解析。