组合模式:将对象组合成树形结构来表现”部分-整体“的层次结构。
目的(重点):使得客户以一致的方式处理单个对象以及对象的组合。
<?php
header("Content-type: text/html; charset=utf-8");
//定义抽象类,抽象方法,方法参数根据‘里氏替换原则’传递父类。
abstract class node{
abstract function addnode(node $obj);
abstract function removenode(node $obj);
abstract function show($str);//$str用来保存输出样式
}
class level_1 extends node{
public $nodearr = array();//子节点(对象)保存在数组中
public $name = null; //$name保存当前节点名称
function __construct($name){
$this->name = $name;
}
/*
*方法中的参数为子节点对象,
*/
public function addnode(node $obj){
array_push($this->nodearr,$obj);//将节点对象保存到数组中
}
public function removenode(node $obj){
$a = array_search($obj,$this->nodearr);
unset($this->nodearr[$a]);
}
public function show($str=''){
echo $this->name."<br>";
$str.= "|->";
//$nodearr 数组中可能为多维数组,即改对象为多级结构。此处使用递归。
foreach($this->nodearr as $arr){
echo $str;
$arr->show($str);
}
}
}
//叶子节点不再有子节点,只实现输出。
class level_2 extends node{
public $name = null;
function __construct($name){
$this->name = $name;
}
function addnode(node $obj){return false;}
function removenode(node $obj){return false;}
function show($str){
echo $this->name.'<br>';
}
}
$p = new level_1('手机');
$p1 = new level_2('华为');
//$p->addnde($p); //不能添加自己为自己的子节点,会出现无限递归。
$p->addnode($p1);
$p->addnode($p2);
$p->show();//两层结构
$com = new level_1('数码');
$com->addnode($p);
$com->show();//三层结构
?>