学习php设计模式 php实现合成模式(composite)


Posted in PHP onDecember 08, 2015

一、意图
将对象组合成树形结构以表示”部分-整体”的层次结构。Composite使用户对单个对象和组合对象的使用具有一致性。
Composite变化的是一个对象的结构和组成。
二、合成模式中主要角色
抽象组件(Component)角色:抽象角色,给参加组合的对象规定一个接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件
树叶组件(Leaf)角色:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义图元对象的行为。
树枝组件(Composite)角色:存储子部件。定义有子部件的那些部件的行为。在Component接口中实现与子部件有关的操作。
客户端(Client):通过Component接口操纵组合部件的对象
三、合成模式的优点和缺点
Composite模式的优点
1、简化客户代码
2、使得更容易增加新类型的组件

Composite模式的缺点:使你的设计变得更加一般化,容易增加组件也会产生一些问题,那就是很难限制组合中的组件
四、合成模式适用场景
1、你想表示对象的部分-整体层次结构
2、你希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象。
五、合成模式与其它模式
装饰器模式:Decorator模式经常与Composite模式一起使用。当装饰与合成一起使用时,它们通常有一个公共的父类。因此装饰必须支持具有add,remove和getChild操作的Component接口
享元模式:Flyweight模式让你共享组件,但不再引用他们的父部件
迭代器模式:Itertor可用来遍历Composite
访问者模式:Visitor将本来应该分布在Composite和Leaf类中的操作和行为局部化。
六、安全式的合成模式
在Composite类里面声明所有的用来管理子类对象的方法。这样的做法是安全的。因为树叶类型的对象根本就没有管理子类的方法,因此,如果客户端对树叶类对象使用这些方法时,程序会在编译时期出错。编译通不过,就不会出现运行时期错误
这样的缺点是不够透明,因为树叶类和合成类将具有不同的接口。
七、安全式的合成模式结构图 

学习php设计模式 php实现合成模式(composite)

八、安全式的合成模式PHP示例

<?php
/**
 * 抽象组件角色
 */
interface Component {
 
 /**
  * 返回自己的实例
  */
 public function getComposite();
 
 /**
  * 示例方法
  */
 public function operation();
}
 
/**
 * 树枝组件角色
 */
class Composite implements Component {
 private $_composites;
 
 public function __construct() {
  $this->_composites = array();
 }
 
 public function getComposite() {
  return $this;
 }
 
 /**
  * 示例方法,调用各个子对象的operation方法
  */
 public function operation() {
  echo 'Composite operation begin:<br />';
  foreach ($this->_composites as $composite) {
   $composite->operation();
  }
  echo 'Composite operation end:<br /><br />';
 }
 
 /**
  * 聚集管理方法 添加一个子对象
  * @param Component $component 子对象
  */
 public function add(Component $component) {
  $this->_composites[] = $component;
 }
 
 /**
  * 聚集管理方法 删除一个子对象
  * @param Component $component 子对象
  * @return boolean 删除是否成功
  */
 public function remove(Component $component) {
  foreach ($this->_composites as $key => $row) {
   if ($component == $row) {
    unset($this->_composites[$key]);
    return TRUE;
   }
  }
 
  return FALSE;
 }
 
 /**
  * 聚集管理方法 返回所有的子对象
  */
 public function getChild() {
  return $this->_composites;
 }
 
}
 
class Leaf implements Component {
 private $_name;
 
 public function __construct($name) {
  $this->_name = $name;
 }
 
 public function operation() {
  echo 'Leaf operation ', $this->_name, '<br />';
 }
 
 public function getComposite() {
  return null;
 }
}
 
 
/**
 * 客户端
 */
class Client {
 
 /**
  * Main program.
  */
 public static function main() {
  $leaf1 = new Leaf('first');
  $leaf2 = new Leaf('second');
 
  $composite = new Composite();
  $composite->add($leaf1);
  $composite->add($leaf2);
  $composite->operation();
 
  $composite->remove($leaf2);
  $composite->operation();
 }
 
}
 
Client::main();
?>

以上就是使用php实现合成模式的代码,还有一些关于合成模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
php 结果集的分页实现代码
Mar 10 PHP
PHP版国家代码、缩写查询函数代码
Aug 14 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
Aug 31 PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
Laravel实现用户注册和登录
Jan 23 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
php简单计算页面加载时间的方法
Jun 19 PHP
thinkphp实现图片上传功能
Jan 13 PHP
php微信公众号开发模式详解
Nov 28 PHP
laravel框架中视图的基本使用方法分析
Nov 23 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 PHP
如何使用GDB调试PHP程序
Dec 08 #PHP
PHP MPDF中文乱码的解决方式
Dec 08 #PHP
PHP使用MPDF类生成PDF的方法
Dec 08 #PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 #PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 #PHP
学习php设计模式 php实现状态模式
Dec 07 #PHP
学习php设计模式 php实现适配器模式
Dec 07 #PHP
You might like
php对图像的各种处理函数代码小结
2013/07/08 PHP
php缓冲输出实例分析
2015/01/05 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
Exjs 入门篇
2010/04/07 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
百度地图api如何使用
2015/08/03 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
使用纯JS代码判断字符串中有多少汉字的实现方法(超简单实用)
2016/11/12 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python对离散变量的one-hot编码方法
2018/07/11 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
C++面试题:关于链表和指针
2013/06/05 面试题
英文求职信结束语大全
2013/10/26 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
沈阳故宫导游词
2015/01/31 职场文书
财务个人年度总结范文
2015/02/26 职场文书
教师辞职信范文
2015/02/28 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技