设计模式--组合模式

<?php
abstract class Unit {
    abstract public function add_unit(Unit $unit);
    abstract public function remove_unit(Unit $unit);
    abstract public function bomboard_strength();
}

class Army extends Unit {
    private $units = array();
    public function add_unit(Unit $unit) {
        if (in_array($unit, $this->units, true)) {
            return ;
        }
        $this->units[] = $unit;
    }
    public function remove_unit(Unit $unit) {
        $this->units = array_diff($this->units, array($unit), function ($a, $b){return ($a === $b) ? 0 : 1;});
    }
    public function bomboard_strength() {
        $ret = 0;
        foreach ($this->units as $unit) {
            $ret += $unit->bomboard_strength();
        }
        return $ret;
    }
}

class UnitException extends Exception {}

class Archer extends Unit {
    function add_unit(Unit $unit) {
        throw new UnitException(get_class($this). " is a leaf.");
    }
    function remove_unit(Unit $unit) {
        throw new UnitException(get_class($this). " is a leaf.");
    }
    function bomboard_strength() {
        return 4;
    }
}
class LaserCannononUnit extends Unit {
    function add_unit(Unit $unit) {
        throw new UnitException(get_class($this). " is a leaf.");
    }
    function remove_unit(Unit $unit) {
        throw new UnitException(get_class($this). " is a leaf.");
    }
    function bomboard_strength() {
        return 44;
    }
}


//CLIENT CODE
$main_army = new Army();

$main_army->add_unit(new Archer());
$main_army->add_unit(new LaserCannononUnit());

$sub_army = new Army();
$sub_army->add_unit(new Archer());
$sub_army->add_unit(new Archer());
$sub_army->add_unit(new Archer());

$main_army->add_unit($sub_army);

print "attacking with strength: {$main_army->bomboard_strength()}";

上面是简单版本,下面还有改进版!!!

posted @ 2015-09-04 15:50  wy0314  阅读(155)  评论(0)    收藏  举报