首页 > 其他 > 详细

设计模式--组合模式

时间:2015-09-04 17:00:02      阅读:236      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!