学习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 获取mysql数据库信息代码
Mar 12 PHP
超级简单的php+mysql留言本源码
Nov 11 PHP
php数组对百万数据进行排除重复数据的实现代码
Jun 08 PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
destoon各类调用汇总
Jun 20 PHP
thinkphp实现like模糊查询实例
Oct 29 PHP
PHP 验证登陆类分享
Mar 13 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
Jun 04 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 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 is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
javascript动态加载实现方法一
2012/08/22 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
简单谈谈python中的多进程
2016/11/06 Python
python图像常规操作
2017/11/11 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
Python中的引用知识点总结
2019/05/20 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
postman和python mock测试过程图解
2020/02/22 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
Python如何实现定时器功能
2020/05/28 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
成绩单公证书
2014/04/10 职场文书
政府法律服务方案
2014/06/14 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
获奖感言一句话
2015/07/31 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书