php 组合模式,php设计模式(十三)透明组合模式
组合模式用来解决整体和部分可以一致对待的问题;
比如说 文件夹 和其下的 文件;
可以复制文件也可以复制整个文件夹;
组合模式是将对象组合成树形结构以表示整体和部分的层次结构;
可以方便的增加节点;
组合模式分为两种;透明模式
安全模式
我们先来说透明组合模式;
结构
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设计模式(十三)透明组合模式相关推荐
- 组合模式_设计模式结构性:组合模式(CompositePattern)
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 创建型模式、结构型模式和行为型模式_设计模式之创建型模式
设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...
- php工程模式,PHP设计模式(八):工厂模式
Introduction 在PHP设计模式(七):设计模式分类中我们提到过创建设计模式(Creation patterns),创建设计模式专注于设计对象(Object)和实例(Instance)的创建 ...
- 抽象工厂模式_设计模式系列—抽象工厂模式
前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...
- python抽象工厂模式_Python设计模式之抽象工厂模式
Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...
- java的简单工厂模式_java设计模式之简单工厂模式
简单工厂模式的概念 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. ...
- php实现享元模式,php设计模式 flyweight (享元模式)
25种php设计模式,你全都知道吗?下面用代码介绍享元模式(flyweight模式)<?php /** * 享元模式 * * 运用享元技术有效的支持大量细粒度的对象 */ class CD { ...
- 抽象工厂模式_设计模式(3) 抽象工厂模式
抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...
最新文章
- winform 弹出窗体位置设定
- ubuntu 对apahce的php 服务器使用
- 软件工程 软件的估计为什么这么难
- seaborn系列 (16) | 变量关系组图pairplot()
- 冰刃初步使用图解(Win7 64位)
- Android笔记 fragment的向下兼容
- python常用代码总结-python字典的常用方法总结
- 软件交接需要交接哪些内容_从代理记账公司交接,需要交接哪些财务资料?
- 职场这样发邮件,你死定了!
- 10种软件滤波方法的示例程序(匠人转载学习)
- 服务器装2t硬盘分区,2T移动硬盘分区办法
- android app 开源项目,20+个很棒的Android开源项目
- mysql是如何设置候选码_求关系模式中的候选键(软考,数据库)
- 【Scrum】借由数个冲刺,实现产品的敏捷开发!
- 2023面试题大全updating
- 李飞飞学生新作:利用场景图生成图像
- PostgreSQL学习篇9.3 浮点数类型
- 《信号与系统》 实验一 信号的时域分析及Matlab实现
- oracle插入日期异常,Oracle插入日期数据常见的2个问题和解决方法
- 大专计算机专业建设计划书,新时期计算机专业建设的策略
热门文章
- 企业核心员工的长期激励计划
- WebKit.NET-0.5简单应用
- new Random().Next(1, 100); 多线程同时执行结果很高概率相同,
- 手把手教你使用C#操作SQLite数据库,新建数据库,创建表,插入,查询,删除,运算符,like...
- 使用Uploadify实现上传图片生成缩略图例子,实时显示进度条
- oracle易忘函数用法(4)
- Redis与Memcached的比较
- linux下为php添加curl扩展的方法
- Vue电商后台B站的项目需要的材料 密码等
- PHP算法基于相同键合并数组