组合模式和php实现
组合模式(有时候又叫做部分-整体模式):
将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦,内部可以随意更改扩展
从类图上看组合模式形成一种树形结构,由枝干和叶子继承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实现的更多相关文章
- ComponentPattern (组合模式)
import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...
- 设计模式(十一):从文Finder中认识"组合模式"(Composite Pattern)
上一篇博客中我们从从电影院中认识了"迭代器模式"(Iterator Pattern),今天我们就从文件系统中来认识一下“组合模式”(Composite Pattern).说到组合模 ...
- 设计模式(十)组合模式(Composite Pattern)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- 设计模式--组合模式Composite(结构型)
一.概念 组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 二.UML图 1.Component(对象接口),定义 ...
- 组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...
- c#设计模式-组合模式
在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...
- C#设计模式系列:组合模式(Composite)
1.组合模式简介 1.1>.定义 组合模式主要用来处理一类具有“容器特征”的对象——即它们在充当对象的同时,又可以作为容器包含其他多个对象. 1.2>.使用频率 中高 2.组合模式结构图 ...
- php实现设计模式之 组合模式
<?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 * * * 1) 抽象构件角色Co ...
- 轻松掌握:JavaScript组合模式
组合模式 组合模式:将一组对象组合成树形结构,并统一对待组合对象和叶对象,忽略它们之间的不同(因为叶对象也可以也可以包含叶对象而成为组合对象),组合模式中的对象只能是一对多的关系,不能出现多对一. 基 ...
- java设计模式之组合模式
组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...
随机推荐
- Android反复闹钟(每天)的实现
MainActivity例如以下: package cc.cc; import java.util.Calendar; import java.util.Locale; import android. ...
- 大括号对struct进行初始化
1 partial initialization 即所谓的部分初始化. 这个时候,无论该struct变量是static的还是automic的,未显式初始化的成员都会被初始化为默认值.
- 文件上传Apache
Map<String, Object> rtnMap = new HashMap<String, Object>(); // 获取文件 String tempPath = re ...
- xpath中双斜杠的作用// double slash
https://stackoverflow.com/questions/36019544/if-double-slash-is-used-2-times-in-xpath-what-does-it-m ...
- MyEclipse8.5优化
MyEclipse8.5优化 第一步: 取消自动validation validation有一堆,什么xml.jsp.jsf.js等等,我们没有必要全部都去自动校验一下,只是需要的时候才会手工校验一下 ...
- bzoj 4603 平凡的骰子
题目大意: 思路: 首先我们需要求出整个凸多面体的重心 可以通过把多面体剖分为四面体 求出每个四面体的重心 四面体的重心为四个点的坐标和/4 对每个四面体的重心 加上它们体积的权 加权平均数即为整个的 ...
- 提高你的Python: 解释‘yield’和‘Generators(生成器)’
在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" 或者 "定义和使用函数" ...
- Identity 使用的命名空间
必须在视图或控制器类中引用 了using Microsoft.AspNet.Identity 这个命名空间. using Microsoft.AspNet.Identity; 才能使用它User.Id ...
- 视图表单访问控制器操作方法的POST、GET方式对应关系
在视图中,表单默认访问方式是FormMethod.Post(不会将请求显示在地址栏中).在控制器中,操作方法不标注属性,默认为HttpGet属性.会有以下情况出现. 1.表单不指定访问方式(默认形式为 ...
- TCP协议中的三次握手和四次挥手(图解)【转载】
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...