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

  将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦,内部可以随意更改扩展
  从类图上看组合模式形成一种树形结构,由枝干和叶子继承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. 5 微信票据 access_token--开发微信的第二道坎儿

    一 access_token基本概念 定义:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存. 时效性:access_ ...

  2. command 'gcc' failed with exit status 1

    https://stackoverflow.com/questions/11094718/error-command-gcc-failed-with-exit-status-1-while-insta ...

  3. (转)Java中JSON字符串与java对象的互换实例详解

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...

  4. POJ2112 Optimal Milking —— 二分图多重匹配/最大流 + 二分

    题目链接:https://vjudge.net/problem/POJ-2112 Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K T ...

  5. 安装linux各种桌面环境

    1.安装kde ①添加 KDE SC 4.11 库 打开一个终端窗口,在终端窗口中输入如下命令: sudo add-apt-repository ppa:kubuntu-ppa/backports 回 ...

  6. 【Selenium】idea导入eclisp项目的问题

    ①导入:file→new→Project from exiting 选择ecliesp 然后next就可以 ②添加依赖:每个包都要加,引用其他包的类,也要添加依赖 setting选择junit4

  7. 博弈论中的SG函数

    SG函数的定义: g(x) = mex ( sg(y) |y是x的后继结点 ) 其中mex(x)(x是一个自然是集合)函数是x关于自然数集合的补集中的最小值,比如x={0,1,2,4,6} 则mex( ...

  8. 【HAOI 2006】 受欢迎的牛

    [题目链接] 点击打开链接 [算法] 先用tarjan缩点,然后找出度为零的点,即可 [代码] #include<bits/stdc++.h> using namespace std; # ...

  9. linux上部署javaWeb项目

    将web项目打成war包,上传到Linux操作系统tomcat安装目录下的webapps下即可!

  10. java如何遍历map的所有的元素(各种方法)

    JDK1.4中 Map map = new HashMap(); Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map ...