学习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+dbfile开发小型留言本
Oct 09 PHP
PHP中常用数组处理方法实例分析
Aug 30 PHP
php网站来路获取代码(针对搜索引擎)
Jun 08 PHP
php join函数应用
May 04 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
zend framework中使用memcache的方法
Mar 04 PHP
Yii2 加载css、js 载静态资源的方法
Mar 10 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
零基础php编程好学吗
Oct 11 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
TP5框架实现签到功能的方法分析
Apr 05 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/06 PHP
php集成动态口令认证
2016/07/21 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python、Javascript中的闭包比较
2015/02/04 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
python os.fork() 循环输出方法
2019/08/08 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
罗技美国官网:Logitech美国
2020/01/22 全球购物
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
高中生学习生活的自我评价
2013/10/09 职场文书
两只小狮子教学反思
2014/02/05 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
优秀学生干部主要事迹材料
2015/11/04 职场文书
《正比例》教学反思
2016/02/23 职场文书
创业计划书之家政服务
2019/09/18 职场文书
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL