一、组合模式简述

1.组合定义了一个单根继承体系,使具有不同职责的集合可以并肩工作

2.如果想像对待单个对象一样对待组合对象,那么组合模式十分有用

3.组合模式不能很好地在关系数据库中保存数据,但却非常适用于xml的持久化,这是因为xml元素通常是由树型结构的子元素组合而成的。

4.组全模式需要注意操作的成本 ,组合的方法可能会逐级调用对象树中下级分支的方法,如果一个对象树中有大量的子对象,一个简单的调用可能人导致系统崩溃(递归)

二、组合例子

1.简述:要写一些类实现计算部队战斗力,部队内可能有没的军种,不同的军种有不同的战斗力,每个军种由士兵或类似的基本单元构成,一个部队可以合并另一个部队,但一个士兵或基本单元不可以合并另一个士兵或基本单元

2.类图:

三、代码

  1. <?php
  2.  
  3. abstract class Unit {
  4. function getComposite() {
  5. return null;
  6. }
  7.  
  8. abstract function bombardStrength();
  9. }
  10.  
  11. abstract class CompositeUnit extends Unit {
  12. private $units = array();
  13.  
  14. function getComposite() {
  15. return $this;
  16. }
  17.  
  18. protected function units() {
  19. return $this->units;
  20. }
  21.  
  22. function removeUnit( Unit $unit ) {
  23. // >= php 5.3
  24. //$this->units = array_udiff( $this->units, array( $unit ),
  25. // function( $a, $b ) { return ($a === $b)?0:1; } );
  26.  
  27. // < php 5.3
  28. $this->units = array_udiff( $this->units, array( $unit ),
  29. create_function( '$a,$b', 'return ($a === $b)?0:1;' ) );
  30. }
  31.  
  32. function addUnit( Unit $unit ) {
  33. if ( in_array( $unit, $this->units, true ) ) {
  34. return;
  35. }
  36. $this->units[] = $unit;
  37. }
  38. }
  39. class Army extends CompositeUnit {
  40.  
  41. function bombardStrength() {
  42. $ret = 0;
  43. foreach( $this->units as $unit ) {
  44. $ret += $unit->bombardStrength();
  45. }
  46. return $ret;
  47. }
  48.  
  49. }
  50.  
  51. class Archer extends Unit {
  52. function bombardStrength() {
  53. return 4;
  54. }
  55. }
  56.  
  57. class LaserCannonUnit extends Unit {
  58. function bombardStrength() {
  59. return 44;
  60. }
  61. }
  62.  
  63. class UnitScript {
  64. static function joinExisting( Unit $newUnit,
  65. Unit $occupyingUnit ) {
  66. $comp;
  67.  
  68. if ( ! is_null( $comp = $occupyingUnit->getComposite() ) ) {
  69. $comp->addUnit( $newUnit );
  70. } else {
  71. $comp = new Army();
  72. $comp->addUnit( $occupyingUnit );
  73. $comp->addUnit( $newUnit );
  74. }
  75. return $comp;
  76. }
  77. }
  78.  
  79. $army1 = new Army();
  80. $army1->addUnit( new Archer() );
  81. $army1->addUnit( new Archer() );
  82.  
  83. $army2 = new Army();
  84. $army2->addUnit( new Archer() );
  85. $army2->addUnit( new Archer() );
  86. $army2->addUnit( new LaserCannonUnit() );
  87.  
  88. $composite = UnitScript::joinExisting( $army2, $army1 );
  89. print_r( $composite );
  90.  
  91. ?>

运行结果:

  1. Army Object ( [units:CompositeUnit:private] => Array ( [0] => Archer Object ( ) [1] => Archer Object ( ) [2] => Army Object ( [units:CompositeUnit:private] => Array ( [0] => Archer Object ( ) [1] => Archer Object ( ) [2] => LaserCannonUnit Object ( ) ) ) ) )

PHP组合模式的更多相关文章

  1. ComponentPattern (组合模式)

    import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...

  2. 设计模式(十一):从文Finder中认识"组合模式"(Composite Pattern)

    上一篇博客中我们从从电影院中认识了"迭代器模式"(Iterator Pattern),今天我们就从文件系统中来认识一下“组合模式”(Composite Pattern).说到组合模 ...

  3. 设计模式(十)组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  4. 设计模式--组合模式Composite(结构型)

    一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...

  5. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  6. c#设计模式-组合模式

    在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...

  7. C#设计模式系列:组合模式(Composite)

    1.组合模式简介 1.1>.定义 组合模式主要用来处理一类具有“容器特征”的对象——即它们在充当对象的同时,又可以作为容器包含其他多个对象. 1.2>.使用频率 中高 2.组合模式结构图 ...

  8. php实现设计模式之 组合模式

    <?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 * * * 1) 抽象构件角色Co ...

  9. 轻松掌握:JavaScript组合模式

    组合模式 组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一. 基 ...

  10. java设计模式之组合模式

    组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...

随机推荐

  1. disable_irq()与disable_irq_nosync()区别

    disable_irq关闭中断并等待中断处理完后返回, 而disable_irq_nosync立即返回.

  2. springboot日志

    1.日志 Spring Boot内部日志系统使用的是Commons Logging,但开放底层的日志实现.默认为会Java Util Logging, Log4J, Log4J2和Logback提供配 ...

  3. net core 实战之 redis 负载均衡和"高可用"实现

    net core 实战之 redis 负载均衡和"高可用"实现 1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的& ...

  4. haproxy实现mysql从库负载均衡

    本文主要讲述通过haproxy实现mysql从库间的负载均衡,至于mysql主从的搭建,本文不再重述,可以参考我之前写的博客. 1.首先下载haproxy包 wget http://haproxy.1 ...

  5. js之基本包装类型

    为了便于操作“基本类型值”,JS 提供了 三个 特殊的引用类型:Boolean.Number.String.这些类型和其他引用类型相似,但同时 也具备 与各自基本类型相应的特殊行为. 实际上:每当读取 ...

  6. 了解struts2 action的一些原理

    今天在struts2中的 action方法中,打印了一下当前action,即this,还打印了一下当前action引用的service, 在页面中访问该action方法2次,发现action是不一样的 ...

  7. sql中having的使用

    where 和having有什么区别? where 是group by之前进行筛选,having是group by 之后进行统计的筛选,一般having会和group by一起使用,结合聚合函数,统计 ...

  8. javascript与DOM -- 深入理解javascript

    /* 一.文档对象模型Document Object Model DOM(Document Object Model,文档对象模型)是一个通过和JavaScript进行内容交互的API */ /* 注 ...

  9. hdu 1853 Cyclic Tour 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...

  10. JSP页面批量选择&全选操作&选择回显

    效果如下: js验证部分: 页面body部分: 附:控制器Controller中验证批量选择条件回显: