当我们的一个对象可能代表一个单一的实体,或者一个组合的实体,但是仍然需要通过同样的方式被使用时,这种情形则适合使用组合模式的设计。

  组合模式是一种结构型模式。

  当看了书上的解释之后,并不是很理解,遂去翻了翻《大化设计模式》,以下为原文截图:

  看完这本书上的解释之后也不是很理解,但是能够进行编码了,以下为组合模式的代码:

<?php

/**
* 组合模式抽象基类
*/
abstract class CompanyBase{
//节点名称
protected $name; public function __construct($name){ $this->name = $name;
} public function getName(){
return $this->name;
} //增加节点
abstract function add(CompanyBase $c); //删除节点
abstract function remove(CompanyBase $c); //输出节点信息
abstract function show($deep); //节点职责
abstract function work($deep); } /**
* 公司类
*/
class Company extends CompanyBase{
protected $item = []; public function add(CompanyBase $c){
$nodeName = $c->getName(); if(!isset( $this->item[$nodeName] )){ $this->item[$nodeName] = $c;
}else{
throw new Exception("该节点已存在,节点名称:".$nodeName);
}
} public function remove(CompanyBase $c){
$nodeName = $c->getName(); if(isset( $this->item[$nodeName] )){ unset($this->item[$nodeName]);
}else{
throw new Exception("该节点不存在,节点名称:".$nodeName);
}
} public function show($deep = 0){
echo str_repeat("-",$deep).$this->name;
echo "<br>"; foreach($this->item as $value){
$value->show($deep+4);
} }
public function work($deep = 0){ foreach($this->item as $value){
echo str_repeat("&emsp;",$deep)."[{$this->name}]<br>";
$value->work($deep+2);
}
} } /**
* 人力资源部门
*/
class HumanResources extends CompanyBase{ public function add(CompanyBase $c){
throw new Exception("该节点下不能增加节点");
} public function remove(CompanyBase $c){ throw new Exception("该节点下无子节点");
} public function show($deep = 0){
echo str_repeat("-",$deep).$this->name;
echo "<br>"; }
public function work($deep = 0){ echo str_repeat("&emsp;",$deep)."人力资源部门的工作是为公司招聘人才";
echo "<br>";
} } /**
* 商务部门
*/
class Commerce extends CompanyBase{ public function add(CompanyBase $c){
throw new Exception("该节点下不能增加节点");
} public function remove(CompanyBase $c){ throw new Exception("该节点下无子节点");
} public function show($deep = 0){
echo str_repeat("-",$deep).$this->name;
echo "<br>"; }
public function work($deep = 0){ echo str_repeat("&emsp;",$deep)."商务部门的工作是为公司赚取利润";
echo "<br>";
}
}

  设计好类之后,就可以使用它了:

$c = new Company("北京某科技公司");
$h = new HumanResources("人力资源部门");
$com = new Commerce("商务部门");
$c->add($h);
$c->add($com); //天津分公司
//为了偷懒,分公司的部门直接copy母公司的
$c1 = new Company("天津分公司");
$c1->add($h);
$c1->add($com);
$c->add($c1); //武汉分公司
$c2 = new Company("武汉分公司");
$c2->add($h);
$c2->add($com);
$c->add($c2); //使用公司功能
$c->show();
$c->work();

  输出:

总结以下组合模式的特点:

  1. 必须存在不可分割基本元素;
  2. 组合后的物体任然可以被组合。

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. 【GOF23设计模式】组合模式

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

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

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

  9. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...

  10. 再起航,我的学习笔记之JavaScript设计模式15(组合模式)

    组合模式 组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 如果有一个 ...

随机推荐

  1. KMP算法的细节问题

    preface: 想必,很多人都知道D.E.Knuth与V.R.Pratt和J.H.Morris同时提出所谓的狂拽酷炫屌炸天的KMP算法,在对字符串的匹配(或是字符串的查找)方面表现出比较好的效率,该 ...

  2. 高效实用的.NET开源项目

    似乎...很久很久没有写博客了,一直都想写两篇,但是却没有时间写.感觉最近有很多事情需要处理,一直都是疲于奔命,一直到最近才变得有些时间学习和充电.最近没有事情都会看一些博客和开源项目,发现介绍开源项 ...

  3. MxNet新前端Gluon模型转换到Symbol

    1. 导入各种包 from mxnet import gluon from mxnet.gluon import nn import matplotlib.pyplot as plt from mxn ...

  4. PHP二维关联数组的遍历方式

    采用foreach循环对二维索引数组进行遍历,相对来讲速度更快,效率更高,foreach循环是PHP中专门用来循环数组的.实例也相对简单,多加练习,想清楚程序运行逻辑即可. <?php $arr ...

  5. DOM2练习

    左右互相输入 <!DOCTYPE html><html>    <head>        <meta charset="UTF-8"&g ...

  6. win10 uwp 右击浮出窗在点击位置

    本文主要让MenuFlyout出现在我们右击位置. 我们一般使用的MenuFlyout写在前台,写在Button里面,但是可能我们的MenuFlyout显示的位置和我们想要的不一样. 通过使用后台写S ...

  7. 简述Apache的ab测试主要有那些关键指标

    一.ab的原理 ab是apachebench命令的缩写. ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的,因此,它既可以用来测试ap ...

  8. 仿微信抢红包(js 转)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Idea报错Check $M2_HOME environment variable and mvn script match.

    -Dmaven.multiModuleProjectDirectory=$M2_HOME

  10. 一、JAVA环境变量配置详解——JavaWeb点滴

    JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH. JAVA_HOME 指向 ...