什么是组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
应用场景
-
在树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
-
组合模式让你可以优化处理递归或分级数据结构。
PHP 代码实现
<?php
/**
* 单位战斗抽象类
* Class Unit
*/
abstract class Unit
{
function getComposite()
{
return null;
}
abstract function bombardStrength();
}
/**
* 单位战斗扩展
* Class CompositeUnit
*/
abstract class CompositeUnit extends Unit
{
protected $units = [];
public function getComposite()
{
return $this;
}
protected function units()
{
return $this->units;
}
/**
* 移除单位
* @param Unit $unit
*/
public function removeUnit(Unit $unit)
{
$this->units = array_udiff($this->units, array($unit), function($a, $b){
return ($a === $b) ? 0 : 1;
});
}
/**
* 添加单位
* @param Unit $unit
*/
public function addUnit(Unit $unit)
{
if (in_array($unit, $this->units, true)) {
return;
}
$this->units[] = $unit;
}
}
/**
* 弓箭手
* Class Archer
*/
class Archer extends CompositeUnit
{
public function bombardStrength(){
return 10;
}
}
/**
* 激光炮
* Class LaserCanonUnit
*/
class LaserCanonUnit extends CompositeUnit
{
public function bombardStrength(){
return 20;
}
}
/**
* 骑兵对象
* Class Cavalry
*/
class Cavalry extends CompositeUnit
{
function bombardStrength(){
return 30;
}
}
/**
* 军队为各个武器的组合
* Class Army
*/
class Army extends CompositeUnit
{
/**
* 计算攻击强度
* @return int
*/
function bombardStrength(){
$ret = 0;
foreach ($this->units as $unit){
$ret += $unit->bombardStrength();
}
return $ret;
}
}
//=======================组合模式测试===============================
$main_army = new Army();
$main_army->addUnit(new Archer());
$main_army->addUnit(new LaserCanonUnit());
print "攻击强度:{$main_army->bombardStrength()}<br>";
$sub_army = new Army();
$sub_army->addUnit(new Archer());
$sub_army->addUnit(new Cavalry());
$sub_army->addUnit(new LaserCanonUnit());
$main_army->addUnit($sub_army);
print "攻击强度:{$main_army->bombardStrength()}<br>";
//结果
//攻击强度:30
//攻击强度:90
参考书籍【深入PHP:面向对象、模式与实践(第三版)】