组合模式 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 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~