学习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 七大优势分析
Jun 23 PHP
php下通过伪造http头破解防盗链的代码
Jul 03 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
win7下memCache的安装过程(具体操作步骤)
Jun 28 PHP
php发送post请求函数分享
Mar 06 PHP
php遍历数组的4种方法总结
Jul 05 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
laravel5.2实现区分前后台用户登录的方法
Jan 11 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
Oct 10 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
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
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python算法之栈(stack)的实现
2014/08/18 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
食品营养与检测应届生求职信
2013/11/08 职场文书
药品营销策划方案
2014/06/15 职场文书
验房委托书
2014/08/30 职场文书
党性教育心得体会
2014/09/03 职场文书
教师个人总结范文
2015/02/11 职场文书
个人优缺点总结
2015/02/28 职场文书
会计试用期自我评价
2015/03/10 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书