组合模式用来解决整体和部分可以一致对待的问题;

比如说 文件夹 和其下的 文件;

可以复制文件也可以复制整个文件夹;

组合模式是将对象组合成树形结构以表示整体和部分的层次结构;

可以方便的增加节点;

组合模式分为两种;透明模式

安全模式

我们先来说透明组合模式;

结构

Component:包含树枝节点和叶子节点方法的抽象类

Composite:树枝节点 有子节点 示例中指 Dir 文件夹

Leaf:叶子节点 没有子节点 示例中指 File 文件

示例

包含树枝节点和叶子节点方法的抽象类

Component.php<?php

namespace Baijunyao\DesignPatterns\SafeComposite;

/**

* 包含树枝节点和叶子节点方法的抽象类

*

* Class Component

* @package Baijunyao\DesignPatterns\SafeComposite

*/

abstract class Component

{

/**

* @var

*/

protected $name;

/**

* Component constructor.

* @param $name

*/

public function __construct($name)

{

$this->name = $name;

}

/**

* @return mixed

*/

abstract public function display();

}

文件夹

Dir.php<?php

namespace Baijunyao\DesignPatterns\SafeComposite;

/**

* 文件夹

*

* Class Dir

* @package Baijunyao\DesignPatterns\SafeComposite

*/

class Dir extends Component

{

/**

* @var array

*/

protected $children = [];

/**

* 添加子节点

*

* @param Component $component

*/

public function add(Component $component)

{

$this->children[] = $component;

}

/**

* @return mixed|string

*/

public function display()

{

$nameStr = $this->name .'
';

foreach ($this->children as $k => $v) {

$nameStr .= '--' . $v->display();

}

return $nameStr;

}

}

文件

File.php<?php

namespace Baijunyao\DesignPatterns\SafeComposite;

/**

* 文件

*

* Class File

* @package Baijunyao\DesignPatterns\SafeComposite

*/

class File extends Component

{

/**

* @param Component $component

* @throws \Exception

*/

public function add(Component $component)

{

throw new \Exception('文件不能添加子节点');

}

/**

* @return mixed|string

*/

public function display()

{

return '--' . $this->name .'
';

}

}

运行;

index.php<?php

namespace Baijunyao\DesignPatterns\SafeComposite;

require __DIR__.'/../vendor/autoload.php';

/**

* 客户端

*

* Class Client

* @package Baijunyao\DesignPatterns\SafeComposite

*/

class Client

{

/**

* 运行

*/

public function run()

{

$designPatterns = new Dir('design-patterns');

$classAdapter = new Dir('ClassAdapter');

$objectAdapter = new Dir('ObjectAdapter');

$safeComposite = new Dir('SafeComposite');

$designPatterns->add($classAdapter);

$designPatterns->add($objectAdapter);

$designPatterns->add($safeComposite);

$componentFile = new File('Component.php');

$dirFile = new File('Dir.php');

$fileFile = new File('File.php');

$indexFile = new File('index.php');

$safeComposite->add($componentFile);

$safeComposite->add($dirFile);

$safeComposite->add($fileFile);

$safeComposite->add($indexFile);

echo $designPatterns->display();

}

}

$client = new Client();

$client->run();

运行结果是这个样子的;

我们看一眼 UML ;

再回头看下 File.php ;

File 作为叶子其下是不能再有子节点的;

但是为了让树枝节点和叶子能有一个统一的操作;

我们在抽象类 Component.php 中定义了 add 方法;

作为示例为了简化只写了个 add 配套的 remove 等都没写;

这种方式是透明了却不安全;

我们又不得不在 File 的 add 方法中抛出错误;

php 组合模式,php设计模式(十三)透明组合模式相关推荐

  1. 组合模式_设计模式结构性:组合模式(CompositePattern)

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  2. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  3. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  4. php工程模式,PHP设计模式(八):工厂模式

    Introduction 在PHP设计模式(七):设计模式分类中我们提到过创建设计模式(Creation patterns),创建设计模式专注于设计对象(Object)和实例(Instance)的创建 ...

  5. 抽象工厂模式_设计模式系列—抽象工厂模式

    前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...

  6. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  7. java的简单工厂模式_java设计模式之简单工厂模式

    简单工厂模式的概念 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. ...

  8. php实现享元模式,php设计模式 flyweight (享元模式)

    25种php设计模式,你全都知道吗?下面用代码介绍享元模式(flyweight模式)<?php /** * 享元模式 * * 运用享元技术有效的支持大量细粒度的对象 */ class CD { ...

  9. 抽象工厂模式_设计模式(3) 抽象工厂模式

    抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...

最新文章

  1. winform 弹出窗体位置设定
  2. ubuntu 对apahce的php 服务器使用
  3. 软件工程 软件的估计为什么这么难
  4. seaborn系列 (16) | 变量关系组图pairplot()
  5. 冰刃初步使用图解(Win7 64位)
  6. Android笔记 fragment的向下兼容
  7. python常用代码总结-python字典的常用方法总结
  8. 软件交接需要交接哪些内容_从代理记账公司交接,需要交接哪些财务资料?
  9. 职场这样发邮件,你死定了!
  10. 10种软件滤波方法的示例程序(匠人转载学习)
  11. 服务器装2t硬盘分区,2T移动硬盘分区办法
  12. android app 开源项目,20+个很棒的Android开源项目
  13. mysql是如何设置候选码_求关系模式中的候选键(软考,数据库)
  14. 【Scrum】借由数个冲刺,实现产品的敏捷开发!
  15. 2023面试题大全updating
  16. 李飞飞学生新作:利用场景图生成图像
  17. PostgreSQL学习篇9.3 浮点数类型
  18. 《信号与系统》 实验一 信号的时域分析及Matlab实现
  19. oracle插入日期异常,Oracle插入日期数据常见的2个问题和解决方法
  20. 大专计算机专业建设计划书,新时期计算机专业建设的策略

热门文章

  1. 企业核心员工的长期激励计划
  2. WebKit.NET-0.5简单应用
  3. new Random().Next(1, 100); 多线程同时执行结果很高概率相同,
  4. 手把手教你使用C#操作SQLite数据库,新建数据库,创建表,插入,查询,删除,运算符,like...
  5. 使用Uploadify实现上传图片生成缩略图例子,实时显示进度条
  6. oracle易忘函数用法(4)
  7. Redis与Memcached的比较
  8. linux下为php添加curl扩展的方法
  9. Vue电商后台B站的项目需要的材料 密码等
  10. PHP算法基于相同键合并数组