当前位置:首页 > PHP教程 > php高级应用 > 列表

什么是组合模式?(举例说明)

发布:smiling 来源: PHP粉丝网  添加日期:2020-02-17 19:17:18 浏览: 评论:0 

组合模式 (Composite Pattern)

组合模式:允许客户将对象组合成树形结构来表现"整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。

包含其他组件的组件为组合对象;不包含其他组件的组件为叶节点对象。

组合模式为了保持”透明性“,常常会违反单一责任原则。也就是说,它一方面要管理内部对象,另一方面要提供一套访问接口。

当组合模式接口里提供删除子节点的方法时,在组件里有一个指向父节点的指针的话,实现删除操作会比较容易。

以一个军队的战斗力计算为例演示组合模式

军队由步兵、炮兵、特种兵组成,他们都具备一个能力就是战斗并具备各自的战斗力。我们通过他们组合成一个军队并完成战斗力的计算。

  1. <?php 
  2.  
  3. //抽象士兵类 
  4.  
  5. interface soldier{ 
  6.  
  7. public function fire(); 
  8.  
  9.  
  10. //步兵 攻击力5 
  11.  
  12. class bubing implements soldier{ 
  13.  
  14. public function fire(){ 
  15.  
  16. return 5; 
  17.  
  18.  
  19.  
  20. //炮兵 攻击力8 
  21.  
  22. class paobing implements soldier{ 
  23.  
  24. public function fire(){ 
  25.  
  26. return 8; 
  27.  
  28.  
  29.  
  30. //特种兵 攻击力 12 
  31.  
  32. class tezhongbing implements soldier{ 
  33.  
  34. public function fire(){ 
  35.  
  36. return 12; 
  37.  
  38.  
  39.  
  40. //军队类实现兵种的组合 
  41.  
  42. class arm{ 
  43.  
  44. //存储作战兵种的数组  
  45.  
  46. private $soldier = array(); 
  47.  
  48. //添加作战兵种 
  49.  
  50. public function add($soldierType){ 
  51.  
  52. //获取对应的兵种对象 
  53.  
  54. $soldier  = new $soldierType(); 
  55.  
  56. //保存进数组利用数组的键记录兵种 便于删除 
  57.  
  58. $this->soldier[$soldierType] = $soldier
  59.  
  60.  
  61. //删除兵种 
  62.  
  63. public function delete($soldierType){ 
  64.  
  65. if(isset($this->soldier[$soldierType])){ 
  66.  
  67. unset($this->soldier[$soldierType]); 
  68.  
  69.  
  70.  
  71. //计算并输出战斗能力 
  72.  
  73. public function show(){ 
  74.  
  75. $zhantouli = 0; 
  76.  
  77. foreach($this->soldier as $v){ 
  78.  
  79. $zhantouli += $v->fire(); 
  80.  
  81.  
  82. echo "军队的战斗力: ".$zhantouli
  83.  
  84.  
  85.  
  86. $arm = new arm(); 
  87.  
  88. $arm->add('bubing'); 
  89.  
  90. $arm->add('paobing'); 
  91.  
  92. $arm->show(); 
  93.  
  94. $arm->delete('paobing'); 
  95.  
  96. $arm->show(); 

Tags: 什么是组合模式

分享到: