1.介绍

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

优点: 1、高层模块调用简单。 2、节点自由增加。

缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

2.案例

1、抽象角色(MenuComponent),给参加组合的对象规定一系列接口。接口中包括管理节点的方法

在本例中如add及remove方法。MenuComponent中可以定义一些接口的默认动作。

2、树叶组件(Leaf)角色:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义图元对象的行为。

在本例中为MenuItem,为菜单的具体项,不可以有子项。

3、树枝组件(Composite)角色:存储子部件。定义有子部件的那些部件的行为。在Component接口中实现与子部件有关的操作。

在本例中为Menu,为菜单项,菜单项包含了一个menuComponents数组来储存MenuItem。

// 1.抽象角色
abstract class MenuComponent{
public $name;
public abstract function getName(); public abstract function add( MenuComponent $menu );
public abstract function remove( MenuComponent $menu ); public abstract function getChild( $i );
public abstract function show();
} // 2 叶子组件
class MenuItem extends MenuComponent{
public function __construct( $name ){
$this->name = $name;
} public function getName(){
return $this->name;
} public function add( MenuComponent $menu ){
return ;
} public function remove( MenuComponent $menu ){
return ;
} public function getChild($i){
return ;
} public function show(){
echo '&nbsp;|-'.$this->getName()."<br/>";
}
} // 3树枝组合
class Menu extends MenuComponent{
public $menuComponents = []; public function __construct( $name ){
$this->name = $name;
} public function getName(){
return $this->name;
} public function add( MenuComponent $menu ){
if (in_array($menu, $this->menuComponents,true)){
return ;
}
$this->menuComponents[] = $menu;
} public function remove( MenuComponent $menu ){
if($key = array_search($menu, $this->menuComponents)){
unset($this->menuComponents[$key]);
}
} public function getChild($i){
if( isset($this->menuComponents[$i]) ){
return $this->menuComponents[$i];
}
return ;
} public function show(){
echo ":".$this->getName()."<br/>";
foreach($this->menuComponents as $val ){
$val->show();
}
}
} $menu = new Menu('china');
$menu->add( new MenuItem('shanghai'));
$menu->add( new MenuItem('beijing')); $menu->show();

总结:1.部分中,必须实现抽象类的方法,导致了部分肥胖,违背了接口隔离原则;如果不适应抽象,有违背了依赖倒置原则;

参考资料:http://www.cnblogs.com/colorstory/p/2662308.html

php设计模式七 ---组合模式的更多相关文章

  1. C#设计模式(10)——组合模式(Composite Pattern)

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

  2. c++设计模式15 --组合模式

    今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...

  3. 乐在其中设计模式(C#) - 组合模式(Composite Pattern)

    原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...

  4. JavaScript设计模式之----组合模式

    javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...

  5. C#设计模式(10)——组合模式(Composite Pattern)(转)

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

  6. C#设计模式:组合模式(Composite Pattern)

    一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; ...

  7. 设计模式之组合模式(Composite Pattern)

    一.什么是组合模式? 组合模式提供了一种层级结构,并允许我们忽略对象与对象集合之间的差别 调用者并不知道手里的东西是一个对象还是一组对象,不过没关系,在组合模式中,调用者本来就不需要知道这些 二.举个 ...

  8. 【GOF23设计模式】组合模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_组合模式.树状结构.杀毒软件架构.JUnite底层架构.常见开发场景 package com.test.composite ...

  9. 设计模式:组合模式(Composite)

    定   义:将对象组合树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象使用具有一致性. 结构图: Component类: abstract class Component ...

随机推荐

  1. Tomcat报内存溢出

    1.错误描述 严重:Exception occurred during processing request:null          java.lang.reflect.InvocationTar ...

  2. Linux显示文件和目录的详细资料

    Linux显示文件和目录的详细资料 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls -l 总用量 56 -rw-r--r-- 1 youhaidong y ...

  3. IO网络模型

    多路处理模型MPM MPM是Apache2引入的一个概念,就是将结构模块化.把核心任务处理作为一个可插拔的模块,使其能针对不同的环境进行优化 在这个情况下,就诞生出了处理模式的概念 Prefork 实 ...

  4. 基于 angular 规范的 commit

    基于 angular 规范的 commit commit格式如下: <type>: <subject> <BLANK LINE> <body> type ...

  5. select选中获取索引三种写法

    $('#someId').prop('selectedIndex'); $('option:selected', '#someId').index(); $('#someId option').ind ...

  6. 常用的freemark语法(三)

    一,符号的意义 1.0,单问号 ?后面要加关键字,例如:<#if object?exists>object对象不为空</#if> <#if str??>${str? ...

  7. 生成report由Eamil定時寄出

    Blat 是一个命令行发邮件的小工具,仅支持简单的SMTP协议,需要SMTP服务器的支持. 官网:http://www.blat.net/    下载地址:https://sourceforge.ne ...

  8. PHP二维数组搜索返回数组

    $ar = array( 2 => array( 'catid' => 2, 'catdir' => 'notice', ), 5 => array( 'catid' => ...

  9. C#多线程编程(6)--线程安全2 互锁构造Interlocked

    在线程安全1中,我介绍了线程同步的意义和一种实现线程同步的方法:volatile.volatile关键字属于原子操作的一种,若对一个关键字使用volatile,很多时候会显得很"浪费&quo ...

  10. JavaScript之BOM

    一.什么是BOM? BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行“对话”. 二.Windows对象 Window对象是客户端Ja ...