首页 > 编程语言 >浅谈PHP设计模式的组合模式

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

时间:2023-01-25 00:11:11浏览次数:53  
标签:function PHP 浅谈 Component public add new 设计模式 节点

简介:

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

  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);

标签:function,PHP,浅谈,Component,public,add,new,设计模式,节点
From: https://www.cnblogs.com/phpphp/p/17066566.html

相关文章

  • 适合编程初学者的开源云笔记系统(PHP版)
    目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学编程的,一个都不落下。上述基本涵盖了当前编程开发所有主流语言。左侧为前端版本:安卓、iOS、鸿蒙......
  • 设计模式-装饰器模式
    装饰器模式:在不改变原有类的基础上,动态增加一些额外功能举例:定义一个简单的人,刚开始只会走路,经过装饰之后,添加一些技能,会骑车...添加装饰类,实现原理构造方法是返回要......
  • php高并发的瓶颈到底在哪
    说php不适合高并发?问过facebook没?虽然facebook用的是编译型的php,叫hphp,可以跑在类似jvm的虚拟机上,叫hhvm。只不过后来php出了7.x版本甚至8.x之后性能大幅提升,性能和faceboo......
  • ThinkPHP v5.0.22 RCE分析
    前言距离上次php审计是在ThinkPHPv5.0.24反序列化漏洞分析,这篇笔记本来在很久之前应该就要写的,但是一直对tp路由还是不够熟悉,个人觉得难度要比反序列化高一些,拖了这么久......
  • 【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
    问题描述使用6379端口连接AzureRedis服务,连接失败。因为默认情况下AzureRedis的设置没有打开6379的端口。需要使用SSL(6380端口)进行连接,但是遇见了无法连接的问题。使用......
  • PHP8新特性
    PHP8.1提供的10大功能枚举Fiber(纤维)never返回类型readonly属性final类常量新的array_is_list()函数新的fsync()和fdatasync()函数对字符串键数组解包的支持$_F......
  • 【转载】 浅谈欧洲专利授权后提交生效国程序注意事项及费用控制
    原文地址:浅谈欧洲专利授权后提交生效国程序注意事项及费用控制-Lexology     ============================================   一、引言随着知识......
  • 浅谈测试
    浅谈测试本篇文章将会讲讲个人对测试的理解,以及测试所需要的知识体系,我会从不同角度来分析我们作为测试,所需要掌握的基本技能以及扩展技能。首先,说说测试的职责吧。这......
  • 解决phpMyAdmin点击"结构"列页面失去响应的问题
    最后更新时间2017-12-05.我的环境:phpMyAdmin:4.0.4.1PHP:5.6.11第一步关闭自动更新打开./libraries目录下的vendor_config.php,将VERSION_CHECK_DEFAULT的值设......
  • PHP递归和循环的速度测试
    本文于2017-12-05重新整理.写了一个可以对$_GET,$_POST等输入进行过滤的函数,递归实现如下:functionarray_map_recursive($filters,$data){ $result=[]; for......