学习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 相关文章推荐
Cannot modify header information错误解决方法
Oct 08 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
基于PHP技术开发客服工单系统
Jan 06 PHP
如何使用微信公众平台开发模式实现多客服
Jan 06 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
php执行多个存储过程的方法【基于thinkPHP】
Nov 08 PHP
详解thinkphp中的volist标签
Jan 15 PHP
php实现微信原生支付(扫码支付)功能
May 30 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使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python字典DICT类型合并详解
2017/08/17 Python
python的命名规则知识点总结
2019/10/04 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
HTML5等待加载动画效果
2017/07/27 HTML / CSS
ajax是什么及其工作原理
2012/02/08 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
学校司机岗位职责
2013/11/14 职场文书
三年大学生活自我鉴定
2014/01/21 职场文书
战友聚会策划方案
2014/06/13 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
学校推普周活动总结
2015/05/07 职场文书
初中美术教学反思
2016/02/17 职场文书
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS