组合模式是一系列对象组合成树形结构来表示整体和部分之间的关系,组合模式的主要目的是达到,访问组合对象和访问单个对象具有一致性。
这里的组合对象比较特殊,本身可以是由其他的对象组合而成,同事,这个组合对象又可以组成更复杂对象的一部分。
- 抽象角色(MenuComponent):给参加组合的对象规定统一的接口,接口中包括管理节点的方法,如add、remove,可以定义一些接口的默认动作
- 树叶组件(Leaf)角色:在组合中表示为叶节点对象,叶节点没有子节点。在组合中定义图元对象的行为
- 树枝组件(Composite)角色:存储子部件,定义子部件的部件行为,实现与子部件相关的操作。
/**
*Composite Pattern 组合模式
*/
abstract class MenuComponent
{
public $name;
public abstract function getName();
public abstract function add($menu);
public abstract function remove($menu);
public abstract function getChild($i);
public abstract function show();
}
/**
*菜单项目
*/
class MenuItem extends MenuComponent
{
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function add($menu)
{
return false;
}
public function remove($menu)
{
return false;
}
public function getChild($i)
{
return NULL;
}
public function show()
{
echo '|-' . $this->getName() . "\n";
}
}
/**
*菜单
*/
class Menu extends MenuComponent
{
public $menuComponents = array();
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
public function add($menu)
{
$this->menuComponents[] = $menu;
}
public function remove($menu)
{
$key = array_search($menu, $this->menuComponents);
if($key !== false)
{
unset($this->menuComponetns[$key]);
}
}
public function getChild($i)
{
if(isset($this->menuComponents[$i]))
{
return $this->menuComponents[$i];
}
}
public function show()
{
echo ':' . $this->getName() . "\n";
foreach($this->menuComponents as $v)
{
$v->show();
}
}
}
//使用
class Client
{
public static function main()
{
$menu = new Menu('编程语言');
$menuitem1 = new MenuItem('Java');
$menuitem2 = new MenuItem('C#');
$menuitem3 = new MenuItem('PHP');
$menu->add($menuitem1);
$menu->add($menuitem2);
$menu->add($menuitem3);
$menu->show();
}
}
Client::main();