首页 > 代码库 > php实现设计模式之 组合模式
php实现设计模式之 组合模式
<?php/** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 * * * 1) 抽象构件角色Component:它为组合中的对象声明接口,也可以为共有接口实现缺省行为。2) 树叶构件角色Leaf:在组合中表示叶节点对象——没有子节点,实现抽象构件角色声明的接口。3) 树枝构件角色Composite:在组合中表示分支节点对象——有子节点,实现抽象构件角色声明的接口;存储子部件。 *//* * 以典型的目录构造为例 * 我想建造一个newfile目录,下面有music和novel两个文件夹,music下放置音乐文件,novel下放置小说txt * *///抽象构件角色:对象接口,添加子节点,删除子节点,展示目录结构class dir{ public function add($component){} public function remove($component){} public function display(){}}//树叶构件:树叶没有子节点,不存在add,remove方法,只有展示放啊class leaf extends dir{ public $name; public function __construct($name){ $this->name = $name; } public function display(){//树叶只展示自身名字即可 echo $this->name; }}//树枝构件class file extends dir{ public $name; public $items=array(); 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.‘----‘;//本身 foreach ($this->items as $key=>$value){//子节点若还是树枝,递归调用; 子节点若是树叶,只展示本身 if (is_object($value)){ $value->display(); }else{ echo $value->name.‘--‘; } } }}//构造过程从底层开始$leaf1 = new leaf(‘a.mp4‘);$leaf2 = new leaf(‘b.mp4‘);$file1 = new file(‘music‘);$file1->add($leaf1);$file1->add($leaf2);$file1->remove($leaf1);//$file1->display();$leaf3 = new leaf(‘a.txt‘);$leaf4 = new leaf(‘b.txt‘);$leaf5 = new leaf(‘c.txt‘);$file2 = new file(‘novel‘);$file2->add($leaf3);$file2->add($leaf4);$file2->add($leaf5);//$file2->display();$dir = new file(‘newfile‘);$dir->add($file1);$dir->add($file2);$dir->display();?>
UML类图如下:
php实现设计模式之 组合模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。