极简设计模式-组合模式

组合模式 - 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解析。
本作品采用《CC 协议》,转载必须注明作者和本文链接
Long2Ge
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!