码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式--组合模式

时间:2015-09-04 17:00:04      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

<?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()}";

技术分享

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

设计模式--组合模式

标签:

原文地址:http://www.cnblogs.com/wy0314/p/4781829.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!