组合模式(有时候又叫做部分-整体模式):

  将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦,内部可以随意更改扩展
  从类图上看组合模式形成一种树形结构,由枝干和叶子继承Compont显然不符合里氏代换原则

UML图:

  

    举个通俗的例子,原子是化学反应的基本微粒,它在化学反应中不可分割。现在有 C(碳)、H(氢)、O(氧)、N(氮)4种原子,它们可以随机组合成无数种分子,可以是蛋白质,也可以是脂肪,蛋白质和脂肪就是组合。由蛋白质和脂肪又可以一起被组合成肉、大豆等等。

三大角色:
  抽象结构(Component)角色:此角色实现所有类共有接口的默认行为,声明一个接口管理子部件。
  根/枝节点(Conposite:Protein/Fat)角色:用来存储子部件,实现与子部件有关的操作,如Add()等。
  叶子节点(leaf:C/H/O/N)角色:表示叶子对象,没有子节点。

<?php
header("Content-Type:text/html;Charset=utf-8");
abstract class Component{
private $name;
abstract function getType();
abstract function addComponent($component);
abstract function removeComponent($component);
abstract function getComponent($component);
} //肉是根节点
class Meal extends Component{
public $items = array();
function __construct($name){
$this->name = $name;
}
function getType(){
return $this->name;
}
function addComponent($component){
$this->items[] = $component;
}
function removeComponent($component){
if(array_search($component, $this->items)){
unset($this->items[$key]);
} }
function getComponent($i){
return $this->items[$i];
}
}
//蛋白质是枝节点
class Protein extends Component{
public $items = array();
function __construct($name){
$this->name = $name;
}
function getType(){
return $this->name;
}
function addComponent($component){
$this->items[] = $component;
}
function removeComponent($component){
if(array_search($component, $this->items)){
unset($this->items[$key]);
} }
function getComponent($i){
return $this->items[$i];
}
}
//脂肪是枝节点
class Fat extends Component{
public $items = array();
function __construct($name){
$this->name = $name;
}
function getType(){
return $this->name;
}
function addComponent($component){
$this->items[] = $component;
}
function removeComponent($component){
if(array_search($component, $this->items)){
unset($this->items[$key]);
} }
function getComponent($i){
return $this->items[$i];
}
}
//C是叶子节点
class C extends Component{
function __construct($name){
$this->name = $name;
}
function getType(){
return $this->name;
}
function addComponent($component){
return false;
}
function removeComponent($component){
return false; }
function getComponent($component){
return false;
}
}
//N是叶子节点
class N extends Component{
function __construct($name){
$this->name = $name;
}
function getType(){
return $this->name;
}
function addComponent($component){
return false;
}
function removeComponent($component){
return false; }
function getComponent($component){
return false;
}
} // 测试
$c = new C("碳元素");
$n = new N("氮元素");
$protein = new Protein("蛋白质");
$protein->addComponent($c);
$protein->addComponent($n);
$fat = new Fat("脂肪");
$fat->addComponent($c);
$fat->addComponent($n);
$meal = new Meal("猪肉");
$meal->addComponent($protein);
$meal->addComponent($fat);
print_r($meal->items);

//结果:
Array (
[0] => Protein Object (
    [items] => Array (
                          [0] => C Object ( [name:Component:private] => [name] => 碳元素 )
                          [1] => N Object ( [name:Component:private] => [name] => 氮元素 )
                         )
[name:Component:private] => [name] => 蛋白质
)
[1] => Fat Object (
               [items] => Array (
                          [0] => C Object ( [name:Component:private] => [name] => 碳元素 )
                          [1] => N Object ( [name:Component:private] => [name] => 氮元素 )
                        )
               [name:Component:private] => [name] => 脂肪
     )
)
?>

组合模式和php实现的更多相关文章

  1. ComponentPattern (组合模式)

    import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...

  2. 设计模式(十一):从文Finder中认识"组合模式"(Composite Pattern)

    上一篇博客中我们从从电影院中认识了"迭代器模式"(Iterator Pattern),今天我们就从文件系统中来认识一下“组合模式”(Composite Pattern).说到组合模 ...

  3. 设计模式(十)组合模式(Composite Pattern)

    一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...

  4. 设计模式--组合模式Composite(结构型)

    一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...

  5. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  6. c#设计模式-组合模式

    在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...

  7. C#设计模式系列:组合模式(Composite)

    1.组合模式简介 1.1>.定义 组合模式主要用来处理一类具有“容器特征”的对象——即它们在充当对象的同时,又可以作为容器包含其他多个对象. 1.2>.使用频率 中高 2.组合模式结构图 ...

  8. php实现设计模式之 组合模式

    <?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 * * * 1) 抽象构件角色Co ...

  9. 轻松掌握:JavaScript组合模式

    组合模式 组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一. 基 ...

  10. java设计模式之组合模式

    组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...

随机推荐

  1. Android之弹出多级菜单

    使用布局文件创建菜单:(多级菜单) 在res下创建目录menu(假设已经有啦就不用再创建了) 在该menu目录下创建XML文件这里我把文件名称命名为menu 在创建的menu.XML文件里 写入: & ...

  2. Android ImageLoader 本地缓存

    Android ImageLoader 本地缓存 本地缓存                                                                        ...

  3. api多版本方案(URL)

    api多版本方案(URL) 1.利用url https://www.taofen8.com/api/v2/getXXX 2.利用自定义请求头 api-version https://www.taofe ...

  4. 2015/12/29 eclipse 设置要点 空间 项目 类 eclipse汉化

    开始使用eclipse,双击eclipse.exe文件,启动eclipse.程序会显示一个工作空间的对话框,工作空间用来存放你的项目文件,你可以使用程序默认的,点击确定即可,你也可以重新选择一个文件夹 ...

  5. Webapp兼容性布局

  6. net start sshd 发生系统错误1069--cygwin安装过程

    net start sshd 发生系统错误1069 解决方法: services.msc调出服务,然后CYGWIN sshd服务->属性,修改账户的名字和密码(win7的登录名和密码) 可能还遇 ...

  7. Spring如何实现IOC和AOP的,说出实现原理。

    用过spring的朋友都知道spring的强大和高深,都觉得深不可测,其实当你真正花些时间读一读源码就知道它的一些技术实现其实是建立在一些最基本的技术之上而已:例如AOP(面向方面编程)的实现是建立在 ...

  8. C项目实践--学生成绩管理系统

    1.功能需求分析 学生成绩管理系统是对学生基本信息及成绩的管理.本程序主要实现了对学生的学号.姓名等基本信息以及各项学科成绩进行增加.删除.修改.查询和保存到磁盘文件等操作.主要功能描述如下: (1) ...

  9. HDU2121 Ice_cream’s world II —— 最小树形图 + 不定根 + 超级点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2121 Ice_cream’s world II Time Limit: 3000/1000 MS (J ...

  10. YTU 2895: H--唱歌的鸟儿

    2895: H--唱歌的鸟儿 时间限制: 1 Sec  内存限制: 128 MB 提交: 26  解决: 10 题目描述 烟大东门有一棵大杨树,树上经常会有很多鸟儿飞来飞去.春天来了,学生物的小姜发现 ...