学习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下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
Jun 09 PHP
php若干单维数组遍历方法的比较
Sep 20 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 PHP
php调用Google translate_tts api实现代码
Aug 07 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 PHP
php缓冲输出实例分析
Jan 05 PHP
又十个超级有用的PHP代码片段
Sep 24 PHP
PHP基本语法实例总结
Sep 09 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
Oct 29 PHP
CentOS系统中PHP安装扩展的方式汇总
Apr 09 PHP
详解PHP Swoole与TCP三次握手
May 27 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如何抛出异常处理错误
2011/03/02 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
python实现简单的TCP代理服务器
2014/10/08 Python
Python中str.join()简单用法示例
2018/03/20 Python
Python3最长回文子串算法示例
2019/03/04 Python
Python自动抢红包教程详解
2019/06/11 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
django 单表操作实例详解
2019/07/30 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
法院实习人员自我鉴定
2013/09/26 职场文书
综合测评自我鉴定
2013/10/08 职场文书
采购员岗位职责
2013/11/15 职场文书
写自荐信三大法宝
2014/01/24 职场文书
加拿大留学自荐信
2014/01/28 职场文书
2014年公司植树节活动方案
2014/03/04 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android