2018-2-11-PHP设计模式【组合器模式】

layouttitledateauthordescin_head
post
PHP设计模式之组合器模式
2018-02-11 20:00:02 +0800
南丞
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
<style> .article-content p{ text-indent: 2em; line-height: 1.75rem; }</style>

组合器模式

<?php
// 定义:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性
header("Content-type: text/html; charset=utf-8");

/**
 * 抽象
 */
abstract class Company
{
    protected $name; //节点名

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function Add($composite)
    {
    }

    public function Delete($composite)
    {
    }

    public function Dump($length)
    {
    }
}

/**
 * 具体化 - 枝节点  公司
 */
class SubCompany extends Company
{
    private $sub_companys = []; //节点对象组合器

    //添加节点对象
    public function Add($company)
    {
        $this->sub_companys[] = $company;
    }

    //删除一个节点对象
    public function Delete($company)
    {
        $key = array_search($company, $this->sub_companys);
        if (false !== $key) {
            unset($this->sub_companys[$key]);
        }
    }

    # 打印对象组合
    public function Dump($length = 1)
    {
        $hr = '├';
        for ($i = 0; $i < $length; $i++) {
            $hr .= "─";
        }
        echo $hr . $this->name . "<br/>";
        foreach ($this->sub_companys as $val) {
            $val->Dump($length + 1); // 让叶子节点继续打印,这一步+1很重要
        }
    }
}

/**
 *  具体化 叶子节点  部门
 */
class Dept extends Company
{
    //添加节点名称
    public function __construct($name)
    {
        parent::__construct($name);
    }

    // 增加一个节点对象
    public function Add($company)
    {
        echo '叶子节点,不给你再添加节点....';
    }
    //删除一个节点对象
    public function Delete($company)
    {
      echo '叶子节点 不给你删除节点';
    }

    // 打印对象组合
    public function Dump($length){
        $hr =  '├';
        for ($i=0; $i<$length; $i++){
            $hr .= "─";
        }
        echo $hr.$this->name. "<br/>";
    }
}

# 创建一级根节点
$root = new SubCompany('总部');
$root->Add(new Dept("财务部"));
$root->Add(new Dept("技术部"));
$root->Add(new Dept("商务部"));
$root->Add(new Dept("采购部"));
$root->Dump();
echo '<br/>';
# 创建二级节点,实际上在没有关联到总部之前,分公司还是一级节点
$guangzhou = new SubCompany('广州分公司');
$guangzhou->Add(new Dept("分公司财务部"));
$guangzhou->Add(new Dept("分公司技术部"));
$guangzhou->Add(new Dept("分公司商务部"));
$guangzhou->Add(new Dept("分公司采购部"));
$guangzhou->Dump();
echo '<br/>';
# 向一级节点关联二级节点
$root->Add($guangzhou);

$shanghai = new SubCompany('上海分公司');
$shanghai->Add(new Dept("分公司财务部"));
$shanghai->Add(new Dept("分公司技术部"));
$shanghai->Add(new Dept("分公司商务部"));
$shanghai->Add(new Dept("分公司采购部"));
$shanghai->Dump();
echo '<br/>';
# 向一级节点关联二级节点
$root->Add($shanghai);
$root->Dump();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值