PHP设计模式(十二)组合模式的实现

作者: 温新

分类: 【设计模式】

阅读: 2748

时间: 2020-04-18 13:53:49

一、什么是组合模式(Composite Pattern)

1)组合模式又叫部分整体模式,用于把一组相似的对象当作一个单一的对象。

2)组合模式依据树形结构来组合对象,用来表示部分以及整体层次,如 公司组织架构,省份所辖城市

二、组合模式结构

组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口

叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点

合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)

三、组合模式使用场景

1)表达对象的部分-整体的层次结构时

2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时

四、组合模式优缺点

优点:

1)组合模式使得客户端代码可以一致地处理对象和对象容器,无需关系处理的单个对象,还是组合的对象容器

2)将”客户代码与复杂的对象容器结构“解耦

3)可以更容易地往组合对象中加入新的构件。

缺点:

使得设计更加复杂。客户端需要花更多时间理清类之间的层次关系。

五、代码实现

Component.php // 抽象接口,定义实现

<?php

/**
 * 组合部件抽象角色,为要组合的对象提供统一的接口
 * 管理子对象方法,如增加、删除
 */
abstract class Component
{

    // 节点名称
    protected $name;

    // 初始化节点名称
    public function __construct($name)
    {
        $this->name = $name;
    }

    // 添加节点
    abstract public function add(Component $component);
    // 显示节点
    abstract public function show($depth);

}

Composite.php // 枝节点

<?php

/**
 * 合成部件,定义枝节点行为,存储部件
 */
class Composite  extends Component
{
    // 存储枝节点和叶节点
    private $children = [];

    // 实现节点添加
    public function add(Component $component)
    {
        $this->children[] = $component;
    }


    // 显示节点
    public function show($depth)
    {
        $name = str_repeat('-' , $depth) . $this->name . '<br>';
        foreach($this->children as $v){
            $name .= str_repeat('-' , $depth) . $v->show($depth + 2);
        }

        return $name;
    }
}

Leaf.php 叶子节点

<?php

/**
 * 叶子节点
 */
class Leaf extends Component
{
    // 叶子节点没有子节点,禁止叶子节点添加子节点
    public function add(Component $component)
    {
        echo '不能添加节点';
    }

    // 显示节点
    public function show($depth)
    {
        return str_repeat('-' , $depth) . $this->name . '<br>';
    }
}

index.php // 客户端

<?php
include './Component.php';
include './Composite.php';
include './Leaf.php';

class index
{
    public static function idx()
    {

        $company = new Composite('国汽北京总部');
        $shCompany = new Composite('国汽上海分公司');
        $zjCompany = new Composite('国汽浙江分公司');

        $company->add($shCompany);
        $company->add($zjCompany);

        $shSonCompany = new Leaf('徐汇区国汽第三分公司');
        $shCompany->add($shSonCompany);

        $zjSonCompany = new Leaf('杭州国汽第一分公司');
        $zjCompany->add($zjSonCompany);

        echo $company->show(0);
    }
}

index::idx();

// 输出结果
国汽北京总部
--国汽上海分公司
------徐汇区国汽第三分公司
--国汽浙江分公司
------杭州国汽第一分公司

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年04月18日

请登录后再评论