组合模式 Composite Pattern

未匹配的标注

定义

组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。
组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式。

设计的原则和思想

  1. 解耦的是客户程序与复杂元素内部结构。
  2. 不变部分是元素之间的层次结构,变化部分是元素。
  3. 核心思想是组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。

一句话概括设计模式

元素与元素之间形成“整体—部分”的层次结构。

结构中包含的角色

  1. Component(抽象构件)
  2. Leaf(叶子构件)
  3. 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();

优点

  1. 节点自由增加。
  2. 可以利用多态和递归机制更方便地使用复杂树结构。
  3. 方便对整个层次结构进行控制。

缺点

  1. 叶子和树枝的声明都是实现类,违反了依赖倒置原则。
  2. 对于功能差异较大的类, 提供公共接口或许会有困难。
  3. 在增加新构件时很难对容器中的构件类型进行限制。

何时使用

  1. 具有部分-整体层次结构(树形结构)。
  2. 以相同方式处理简单和复杂元素。

实际应用场景

  1. 文件系统。
  2. 公司的组织结构。
  3. 在XML解析。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~