您的位置:首页 > 编程语言 > PHP开发

[php] 设计模式之 组合模式

2016-09-01 01:39 513 查看
<?php
//组合模式
//用军队兵力 来说明这个模式
header('Content-type:text/html; charset=utf-8');

//人类
abstract class Human
{
abstract function getAttack();
}
//士兵类
class Soldiers extends Human
{
private $units = array();
//攻击力
protected $attack = 0;
//得到总兵力
public function getAttack(){
$sum = 0;
foreach($this->units as $v){
$sum += $v->attack;
}
return '总兵力'.$sum.'<br/>';
}
//获得集合
public function getUnits(){
return $this->units;
}
//增加兵种
public function addspecies(Soldiers $soldiers){
if(in_array($soldiers, $this->units, true)){
return;
}
$this->units[] = $soldiers;
}
//减少兵种
public function delspecies(Soldiers $soldiers){
$units = array();
foreach($this->units as $val){
if($val instanceof $soldiers){
continue;
}else{
$units[] = $val;
}
}
$this->units = $units;
}
}
//炮兵类
class Artillery extends Soldiers
{
public function __construct($val = 0){
$this->attack = $val;
}
}
//步兵类
class Infantry extends Soldiers
{
public function __construct($val = 0){
$this->attack = $val;
}
}
//集团
class Group extends Soldiers
{
public function __construct($val = 0){
$this->attack = $val;
}
}
//集团军1
$t = new Group();
$t->addspecies(new Artillery(10));
$t->addspecies(new Infantry(12));
echo '增加两个兵种后'.$t->getAttack();

$t->delspecies(new Infantry(2));
echo '删除一个兵种后'.$t->getAttack();

//集团军2
$t1 = new Group();
$t1->addspecies(new Infantry(30));
echo '集团军2'.$t1->getAttack();

//合并集团军1,2
foreach($t1->getUnits() as $k){
$t->addspecies($k);
}
echo '合并集团军1,2后'.$t->getAttack();
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: