PHP设计模式之组合模式(Composite Pattern)

组合模式是一系列对象组合成树形结构来表示整体和部分之间的关系,组合模式的主要目的是达到,访问组合对象和访问单个对象具有一致性。

这里的组合对象比较特殊,本身可以是由其他的对象组合而成,同事,这个组合对象又可以组成更复杂对象的一部分。

  • 抽象角色(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();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值