php设计模式 Composite (组合模式)

复制代码 代码如下:

  <?php

  /**

  * 组合模式

  *

  * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性

  */

  abstract class MenuComponent

  {

  public function add($component){}

  public function remove($component){}

  public function getName(){}

  public function getUrl(){}

  public function display(){}

  }

  class Menu extends MenuComponent

  {

  private $_items = array();

  private $_name = null;

  public function __construct($name)

  {

  $this->_name = $name;

  }

  public function add($component)

  {

  $this->_items[] = $component;

  }

  public function remove($component)

  {

  $key = array_search($component,$this->_items);

  if($key !== false) unset($this->_items[$key]);

  }

  public function display()

  {

  echo "-- ".$this->_name." ---------<br/>";

  foreach($this->_items as $item)

  {

  $item->display();

  }

  }

  }

  class Item extends MenuComponent

  {

  private $_name = null;

  private $_url = null;

  public function __construct($name,$url)

  {

  $this->_name = $name;

  $this->_url = $url;

  }

  public function display()

  {

  echo $this->_name."#".$this->_url."<br/>";

  }

  }

  class Client

  {

  private $_menu = null;

  public function __construct($menu)

  {

  $this->_menu = $menu;

  }

  public function setMenu($menu)

  {

  $this->_menu = $menu;

  }

  public function displayMenu()

  {

  $this->_menu->display();

  }

  }

  // 实例一下

  // 创建menu

  $subMenu1 = new Menu("sub menu1");

  $subMenu2 = new Menu("sub menu2");

  $subMenu3 = new Menu("sub menu3");

  $item1 = new Item("163","www.163.com");

  $item2 = new Item("sina","www.sina.com");

  $subMenu1->add($item1);

  $subMenu1->add($item2);

  $item3 = new Item("baidu","www.baidu.com");

  $item4 = new Item("google","www.google.com");

  $subMenu2->add($item3);

  $subMenu2->add($item4);

  $allMenu = new Menu("All Menu");

  $allMenu->add($subMenu1);

  $allMenu->add($subMenu2);

  $allMenu->add($subMenu3);

  $objClient = new Client($allMenu);

  $objClient->displayMenu();

  $objClient->setMenu($subMenu2);

  $objClient->displayMenu();