学习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 相关文章推荐
adodb与adodb_lite之比较
Dec 31 PHP
MySql中正则表达式的使用方法描述
Jul 30 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
php比较两个绝对时间的大小
Jan 31 PHP
Thinkphp中的volist标签用法简介
Jun 18 PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
PHP处理会话函数大总结
Aug 05 PHP
php示例详解Constructor Prototype Pattern 原型模式
Oct 15 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 PHP
php如何计算两坐标点之间的距离
Dec 29 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实现验证码功能
2006/10/09 PHP
怎样在UNIX系统下安装php3
2006/10/09 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
Cookie 小记
2010/04/01 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
用Python给文本创立向量空间模型的教程
2015/04/23 Python
基于Python的接口测试框架实例
2016/11/04 Python
10个Python小技巧你值得拥有
2018/09/29 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
关于Python解包知识点总结
2020/05/05 Python
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
涉外文秘个人求职的自我评价
2013/10/07 职场文书
眼镜促销方案
2014/03/15 职场文书
化工操作工岗位职责
2014/04/29 职场文书
2014年妇女工作总结
2014/12/06 职场文书
党员带头倡议书
2015/04/29 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android