学习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版(5)
Oct 09 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
解析php入库和出库
Jun 25 PHP
简单的php中文转拼音的实现代码
Feb 11 PHP
PHP实现根据银行卡号判断银行
Apr 29 PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 PHP
PHP使用MPDF类生成PDF的方法
Dec 08 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 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面向对象中的魔术方法中文说明
2014/03/04 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
laravel 5.5 关闭token的3种实现方式
2019/10/24 PHP
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
python cumsum函数的具体使用
2019/07/29 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
python 制作简单的音乐播放器
2020/11/25 Python
热能动力工程毕业生自荐信
2013/11/07 职场文书
教师实习自我鉴定
2013/12/18 职场文书
安全教育心得体会
2013/12/29 职场文书
银行求职信
2014/05/31 职场文书
企业宣传标语
2014/06/09 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
软件测试专业推荐信
2014/09/18 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
单身证明格式样本
2015/06/15 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书