学习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
实用函数3
Nov 08 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
php实现图片按比例截取的方法
Feb 06 PHP
PHP中类的自动加载的方法
Mar 17 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 PHP
如何理解PHP核心特性命名空间
May 28 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 程序授权验证开发思路
2009/07/09 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
IE8 原生JSON支持
2009/04/13 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
python自动化测试之连接几组测试包实例
2014/09/28 Python
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
详解Python爬虫的基本写法
2016/01/08 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
世界上最好的足球商店:Unisport
2019/03/02 全球购物
管事部库房保管员岗位职责
2014/02/21 职场文书
小学生寒假家长评语
2014/04/16 职场文书
幼师求职信
2014/06/23 职场文书
工作年限证明模板
2014/11/01 职场文书
2015年试用期工作总结
2014/12/12 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
MySQL一些常用高级SQL语句
2021/07/03 MySQL
MySQL数据库之存储过程 procedure
2022/06/16 MySQL