PHP设计模式——组合器模式

简介: 声明:本系列博客参考资料《大话设计模式》,作者程杰。        组合模式(有时候又叫做部分-整体模式),将对象组合成树形结构以表示“部分整体”的层次结构。

声明:本系列博客参考资料《大话设计模式》,作者程杰。

       组合模式(有时候又叫做部分-整体模式),将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

 

       实现类图:

      


        三大角色:

       

       抽象结构(Company)角色:此角色实现所有类共有接口的默认行为,声明一个接口管理子部件。

       叶子节点(Technology)角色:表示叶子对象,没有子节点。

       枝节点(SubCompany)角色:用来存储子部件,实现与子部件有关的操作,如Add()等。


       实现代码:

      

<?php
/**
 * Created by PhpStorm.
 * User: Jiang
 * Date: 2015/5/2
 * Time: 21:14
 */

/**抽象结构角色          公司
 * Class Company
 */
abstract class Company
{
    protected $name;

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

    /**增加
     * @param Company $company    子公司,部门
     * @return mixed
     */
    abstract function Add(Company $company);

    /**移除
     * @param Company $company   子公司,部门
     * @return mixed
     */
    abstract function Remove(Company $company);

    /**显示公司及部门结构
     * @param $depth
     * @return mixed
     */
    abstract function Display($depth);

}

/**枝节点               子公司
 * Class Beijing
 */
class SubCompany extends Company
{

    private $sub_companys=array();

    function __construct($name)
    {
        parent::__construct($name);
    }

    function Add(Company $company)
    {
        $this->sub_companys[]=$company;
    }

    function Remove(Company $company)
    {
        $key=array_search($company,$this->sub_companys);
        if($key!==false)
        {
            unset($this->sub_companys[$key]);
        }
    }

    function Display($depth)
    {
        $pre="";
        for($i=0;$i<$depth;$i++)
        {
            $pre.="-";
        }
        $pre.=$this->name."<br/>";
        echo $pre;

        foreach($this->sub_companys as $v)
        {
            $v->Display($depth+2);
        }
    }

}

/**叶子节点                    财务部
 * Class DeptCompany
 */
class MoneyDept extends Company
{

    function __construct($name)
    {
        parent::__construct($name);
    }

    /**增加
     * @param Company $company 子公司,部门
     * @return mixed
     */
    function Add(Company $company)
    {
        echo "叶子节点,不能继续添加节点。。。。。。。。。。<br/>";
    }

    /**移除
     * @param Company $company 子公司,部门
     * @return mixed
     */
    function Remove(Company $company)
    {
        echo "叶子节点,不能删除节点。。。。。。。。。。<br/>";
    }

    /**显示公司及部门结构
     * @param $depth
     * @return mixed
     */
    function Display($depth)
    {
        $pre="";
        for($i=0;$i<$depth;$i++)
        {
            $pre.="-";
        }
        $pre.=$this->name."<br/>";
        echo $pre;
    }

}

/**叶子节点                    技术部门
 * Class DeptCompany
 */
class TechnologyDept extends Company
{

    function __construct($name)
    {
        parent::__construct($name);
    }

    /**增加
     * @param Company $company 子公司,部门
     * @return mixed
     */
    function Add(Company $company)
    {
        echo "叶子节点,不能继续添加节点。。。。。。。。。。<br/>";
    }

    /**移除
     * @param Company $company 子公司,部门
     * @return mixed
     */
    function Remove(Company $company)
    {
        echo "叶子节点,不能删除节点。。。。。。。。。。<br/>";
    }

    /**显示公司及部门结构
     * @param $depth
     * @return mixed
     */
    function Display($depth)
    {
        $pre="";
        for($i=0;$i<$depth;$i++)
        {
            $pre.="-";
        }
        $pre.=$this->name."<br/>";
        echo $pre;
    }

}

         测试代码:

         

header("Content-Type:text/html;charset=utf-8");
//------------------------组合器模式测试代码------------------
require_once "./Composer/Composer.php";

$root=new SubCompany("北京总公司");
$root->Add(new MoneyDept("总公司财务部"));
$root->Add(new TechnologyDept("总公司技术部"));

$shanghai=new SubCompany("上海分公司");
$shanghai->Add(new TechnologyDept("上海分公司技术部"));
$shanghai->Add(new MoneyDept("上海分公司财务部"));

$root->Add($shanghai);

$root->Display(1);

echo "<hr/>";

$root->Remove($shanghai);
$root->Display(3);

         优势:

         组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite


    欢迎关注我的视频课程,地址如下,谢谢。


   PHP面向对象设计模式




目录
相关文章
|
3天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
3天前
|
设计模式 算法 测试技术
PHP中的设计模式:策略模式的应用与实践
在软件开发的浩瀚海洋中,设计模式如同灯塔,指引着开发者们避开重复造轮子的暗礁,驶向高效、可维护的代码彼岸。今天,我们将聚焦于PHP领域中的一种重要设计模式——策略模式,探讨其原理、应用及最佳实践,揭示如何通过策略模式赋予PHP应用灵活多变的业务逻辑处理能力,让代码之美在策略的变换中熠熠生辉。
|
5天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
23 8
|
2天前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的灵活性与可维护性
在本文中,我们将深入探讨PHP编程语言中的一种重要概念——设计模式。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,被有经验的面向对象的软件开发人员所采用。本文将通过具体的实例,展示如何在PHP项目中应用设计模式,以提高代码的灵活性和可维护性。无论你是PHP初学者还是经验丰富的开发者,都能从中获得有价值的见解。
|
4天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
4天前
|
设计模式 存储 安全
PHP中的设计模式:单例模式深度解析
在软件开发的广袤天地中,设计模式如同璀璨星辰,指引着程序员们解决复杂问题的方向。其中,单例模式以其独特的魅力,确保了一个类仅有一个实例,并提供了一个访问它的全局访问点,成为众多项目中不可或缺的设计智慧。本文旨在深入探讨PHP中单例模式的实现方式、应用场景及背后的哲理,引导读者思考其在现代软件架构中的重要性与运用策略。
18 5
|
3天前
|
设计模式 存储 数据库连接
探索PHP中的设计模式:提高代码的可维护性与扩展性
本文将深入探讨PHP中常用的设计模式,包括单例模式、工厂模式和观察者模式。通过具体的代码示例,展示如何在实际项目中应用这些设计模式,以提高代码的可维护性与扩展性。无论你是PHP初学者还是有一定经验的开发者,都可以通过本文的学习,提升你的编程技巧和项目架构能力。
|
5天前
|
设计模式 存储 缓存
PHP中的设计模式:单例模式的深入解析
在PHP开发中,设计模式是提高代码可维护性、扩展性和重用性的关键技术之一。本文将深入探讨PHP中的单例模式,包括其定义、实现方式、应用场景以及优缺点。通过对单例模式的全面剖析,帮助开发者更好地理解和应用这一设计模式,从而编写出更加高效和优雅的PHP代码。
|
6天前
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
11 1
|
18天前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式