Skip to content

组合模式又叫部分整体模式属于结构型模式,他把一组相似的对象当做一个单一的对象,从而提供了像管理一个对象一样去管理一组对象的方式,组合模式依靠树型结构的模式来组合管理对象,组合类的一个重要特点是局部类和组合类要具有相同的接口,这样在使用的时候要就可以无差别的使用他们。

php
abstract class Unit
{
    abstract function addUnit(Unit $unit);
    abstract function removeUnit(Unit $unit)
    {
         throw new UnitException(get_class($this).'is a leaf');
    };
    abstract function bombardStrength()
    {
         throw new UnitException(get_class($this).'is a leaf');
    };
}

clsass Army extends Unit
{
    private $units = [];

    public function addUnit(Unit $unit)
    {
        if(in_array($unit,$this->units,true)){
            return;
        }
    }

    public function removeUnit(Unit $unit)
    {
        $this->units = array_udiff($this->units,array($unit),function($a,$b){
            return ($a===$b)?0:1;
        });
    }

    public function bombardStrength()
    {
        $ret = 0;
        foreach($this->units as $unit){
            $ret +=$unit->bombardStrength();
        }
        return $ret;
    }
}

class UnitException extends Exception{}

class Archer extends Unit
{
    public function bombardStrength()
    {
        return 4;
    }
}

class LeaserCannonUnit extens Unit()
{
    public function bombardStrength()
    {
        return 44;
    }
}

//创建一个army对象
$main_army = new Army();
//添加一些Unit对象
$main_army ->addUnit(new Archer());
$main_army ->addUnit(new laserCannonUnit());

//创建一个新的army对象
$sub_army  = new Army();
//添加一些Unit对象
$sub_army ->addUnit(new Archer());
$sub_army ->addUnit(new Archer());
$sub_army ->addUnit(new Archer());

//把第二个Army对象添加到第一二个Army对象中去
$main_army -> addUnit($sub_army);
//计算所有的攻击强度
var_dump($main_army->bombardStrength());