浅谈PHP设计模式的组合模式

简介:

组合模式,属于结构型的设计模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式分两种状态:

  1. 透明方式,子类的所有接口一致,使其叶子节点和枝节点对外界没有区别。
  2. 安全方式,子类接口不一致,只实现特定的接口。

适用场景:

希望客户端可以忽略组合对象与单个对象的差异,进行无感知的调用。

优点:

让客户端忽略层次之间的差异,方便对每个层次的数据进行处理。

缺点:

如果服务端限制类型时,数据不方便处理。

代码:

// component为组合中的对象接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的字部件。
abstract class Component {
    protected $name;

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

    //通常用add和remove方法来提供增加或移除树枝或树叶的功能
    abstract public function add(Component $c);
    abstract public function remove(Component $c);
    abstract public function display($depth);
}


//透明方式和安全方式的区别就在叶子节点上,透明方式的叶子结点可以无限扩充,然而安全方式就是对其做了绝育限制。
class Leaf extends Component {
    public function add(Component $c) {
        echo "不能在添加叶子节点了\n";
    }

    public function remove(Component $c) {
        echo "不能移除叶子节点了\n";
    }

    // 叶节点的具体方法,此处是显示其名称和级别
    public function display($depth) {
        echo '|' . str_repeat('-', $depth) . $this->name . "\n";
    }
}

//composite用来处理子节点,控制添加,删除和展示(这里的展示可以是任意功能)
class Composite extends Component
{
    //一个子对象集合用来存储其下属的枝节点和叶节点。
    private $children = [];

    public function add(Component $c) {
        array_push($this->children, $c);
    }

    public function remove(Component $c) {
        foreach ($this->children as $key => $value) {
            if ($c === $value) {
                unset($this->children[$key]);
            }
        }
    }

    public function display($depth) {
        echo str_repeat('-', $depth) . $this->name . "\n";
        foreach ($this->children as $component) {
            $component->display($depth);
        }
    }
}

//客户端代码
//声明根节点
$root = new Composite('根');

//在根节点下,添加叶子节点
$root->add(new Leaf("叶子节点1"));
$root->add(new Leaf("叶子节点2"));

//声明树枝
$comp = new Composite("树枝");
$comp->add(new Leaf("树枝A"));
$comp->add(new Leaf("树枝B"));
$root->add($comp);


$root->add(new Leaf("叶子节点3"));

//添加并删除叶子节点4
$leaf = new Leaf("叶子节点4");
$root->add($leaf);
$root->remove($leaf);

//展示
$root->display(1);

原文链接:https://www.cnblogs.com/phpphp/p/17066566.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈PHP设计模式的组合模式 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • ThinkPHP基于think-queue的队列插件实现消息推送

    ThinkPHP基于think-queue的队列插件实现消息推送 ThinkPHP是一款流行的PHP框架,它提供了丰富的功能和工具,使得开发者可以快速构建高质量的Web应用程序。其中think-queue是一个基于Redis或者其他队列服务的队列插件,可以用于异步处理任务和消息推送等场景。本文将详细讲解如何使用think-queue插件实现消息推送功能。 安…

    PHP 2023年5月12日
    00
  • 详解PHP 7.4 中数组延展操作符语法知识点

    详解PHP 7.4 中数组延展操作符语法知识点攻略 什么是数组延展操作符 数组延展操作符 … 可以用于展开一个数组,类似于把一个数组中的所有元素直接插入到另一个数组中。 使用场景 在一个数组中插入另一个数组的元素; 合并两个或多个数组; 函数传参时将数组展开。 使用方法 合并数组 合并两个数组时,可以使用 array_merge 函数,如下: $arra…

    PHP 2023年5月26日
    00
  • PHP Curl多线程原理实例详解

    关于“PHP Curl 多线程原理实例详解”,我们可以提供以下攻略: 1. PHP Curl 多线程原理介绍 在使用 PHP Curl 进行网络请求时,单线程的方式会让请求变慢,因此可以通过多线程的方式提高网络请求的速度。多线程的实现原理可以通过 PHP 的 curl_multi_* 系列函数来实现,以下是其主要的步骤: 创建 Curl 的多个资源句柄(cu…

    PHP 2023年5月27日
    00
  • dir()、readdir()、scandir()和glob()四种遍历目录方法及性能分析

    在PHP中,有四种常用的遍历目录方法:dir()、readdir()、scandir()和glob()。这些方法可以帮助我们历目录中的文件和子目录,并对它们进行操作。下面是这四种方法的详细绍和性能分析。 1. dir()方法 dir()方法是PHP中最古老的遍历目录方法,它返回一个目录句柄,可以使用readdir()方法读取目录中的文件和子目录。以下是使用d…

    PHP 2023年5月12日
    00
  • php中数字、字符与对象判断函数用法实例

    “php中数字、字符与对象判断函数用法实例”这个主题,我会从以下几个方面进行讲解: PHP中数字类型判断 在PHP中,要判断一个变量是否是数字类型,可以使用is_numeric()函数。示例如下: $num = 123; if (is_numeric($num)) { echo "这是一个数字"; } else { echo "…

    PHP 2023年5月26日
    00
  • PHP数组去重比较快的实现方式

    PHP数组去重的实现方式有多种,其中较快的实现方式有两种:使用array_flip函数和使用array_unique函数。 方式一:使用array_flip函数 使用array_flip函数的大致步骤如下: 遍历原数组,将原数组的值作为键,新数组的值为1生成一个新的数组。 使用array_keys函数获取新数组的键列表,即去重后的数组。 下面是示例代码: /…

    PHP 2023年5月26日
    00
  • PHP使用流包装器实现WebShell的方法

    使用流包装器可以将任意的输入/输出以流的形式统一处理,包括文件、网络等。利用这种特性,可以使用PHP实现WebShell的功能,也就是通过Web界面控制目标服务器的命令执行。 准备工作 在使用流包装器实现WebShell功能之前,需要了解以下知识点。 流包装器 命令执行 shell命令的输出和错误信息 实现流程 设置表单,获取用户输入的命令 利用stream…

    PHP 2023年5月26日
    00
  • php5编程中的异常处理详细方法介绍

    PHP5编程中的异常处理详细方法介绍 异常处理是PHP5中重要的功能之一,它为我们处理代码中可能出现的错误提供了一种高效的方式。本文将详细介绍PHP5中异常处理的方法。 什么是异常? 在PHP编程过程中,当代码出现问题时,PHP会抛出一个异常(Exception),它是一种处理错误的机制,可以让程序员及时地识别和响应错误。 如何处理异常? 异常处理可以由开发…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部