学习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的计数器程序
Oct 09 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
thinkphp模板继承实例简述
Nov 26 PHP
PHP实现懒加载的方法
Mar 07 PHP
php使用curl打开https网站的方法
Jun 17 PHP
PHP设计模式之简单投诉页面实例
Feb 24 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
php中this关键字用法分析
Dec 07 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 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/12/21 PHP
php下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
php curl基本操作详解
2013/07/23 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
javascript的BOM
2016/05/03 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
Python Django 简单分页的实现代码解析
2019/08/21 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
C#软件工程师英语面试题
2015/06/07 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
六十大寿答谢词
2014/01/12 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
2015年工商所工作总结
2015/05/21 职场文书
销售人员管理制度
2015/08/06 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
Python基础之hashlib模块详解
2021/05/06 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python