学习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程序中的常见漏洞进行攻击
Oct 09 PHP
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
Jan 10 PHP
如何用php获取程序执行的时间
Jun 09 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
php实现encode64编码类实例
Mar 24 PHP
ThinkPHP安装和设置
Jul 27 PHP
Yii框架数据模型的验证规则rules()被执行的方法
Dec 02 PHP
CI框架实现优化文件上传及多文件上传的方法
Jan 04 PHP
php简单生成一组与多组随机字符串的方法
May 09 PHP
Laravel手动返回错误码示例
Oct 22 PHP
PHP中SESSION过期设置
Mar 09 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
在线短消息收发的程序,不用数据库
2006/10/09 PHP
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
php二维数组转成字符串示例
2014/02/17 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
python爬虫框架talonspider简单介绍
2017/06/09 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
英国最大的笔记本电脑直销专家:Laptops Direct
2019/07/20 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
婚礼主持结束词
2014/03/13 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
中药学自荐信
2014/06/15 职场文书
食品安全演讲稿
2014/09/01 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
羊脂球读书笔记
2015/06/30 职场文书
医院消毒隔离制度
2015/08/05 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers