组合模式和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设计模式之组合模式
组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...
随机推荐
- jquery全选,取消全选
近期项目又用到了这个全选和取消全选的操作. 曾经总是自己写纯JS.如今既然知道怎么写了.那怎样用JQ写得更简洁呢.这样也能学到新的东西.假设乎百度一下果然发现了好东东.感谢OSC的iuhoay. 代码 ...
- ZOJ 3962 E.Seven Segment Display / The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple E.数位dp
Seven Segment Display Time Limit: 1 Second Memory Limit: 65536 KB A seven segment display, or s ...
- 较大主干网的ISP通常控制信道利用率不超过50%
信道利用率 网络利用率 加权平均值
- maximize_window fullscreen_window minimize_window
# Licensed to the Software Freedom Conservancy (SFC) under one# or more contributor license agreemen ...
- mongodb01--安装
配置Mongo服务端 安装MongoDB 1.按照操作系统下载http://www.mongodb.org/downloads. 2.在D盘新建MongoDB文件夹(此文件夹为自定义的数据库安装目录D ...
- ubuntu切换中英文通用方法,ubuntu中文语言
1:点击桌面右上角的齿轮,选择“system settings”进入系统设置界面
- linux下jiffies定时器和hrtimer高精度定时器【转】
本文转载自:http://blog.csdn.net/dosculler/article/details/7932315 一.jiffies定时器,HZ=100,精度只能达到10ms. 注:采用jif ...
- YTU 2887: D--机器人Bill
2887: D--机器人Bill 时间限制: 1 Sec 内存限制: 128 MB 提交: 112 解决: 22 题目描述 最近,Dr. Jiang 新设计一个机器人Bill.Bill很聪明,会做 ...
- UICollectionView基础/UICollectionViewCell的四种创建方式
前言 UICollectionViewCell的四种创建方式:http://blog.csdn.net/ZC_Huang/article/details/52002302 这个控件,看起来与UITab ...
- CodeForces-652D:Nested Segments(树状数组+离散化)
You are given n segments on a line. There are no ends of some segments that coincide. For each segme ...