PHP设计模式之组合模式
当我们的一个对象可能代表一个单一的实体,或者一个组合的实体,但是仍然需要通过同样的方式被使用时,这种情形则适合使用组合模式的设计。
组合模式是一种结构型模式。
当看了书上的解释之后,并不是很理解,遂去翻了翻《大化设计模式》,以下为原文截图:




看完这本书上的解释之后也不是很理解,但是能够进行编码了,以下为组合模式的代码:
<?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(" ",$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(" ",$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(" ",$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();
输出:

总结以下组合模式的特点:
- 必须存在不可分割基本元素;
- 组合后的物体任然可以被组合。
PHP设计模式之组合模式的更多相关文章
- C#设计模式(10)——组合模式(Composite Pattern)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- c++设计模式15 --组合模式
今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合 ...
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
原文:乐在其中设计模式(C#) - 组合模式(Composite Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 组合模式(Composite Pattern) 作者:weba ...
- JavaScript设计模式之----组合模式
javascript设计模式之组合模式 介绍 组合模式是一种专门为创建Web上的动态用户界面而量身制定的模式.使用这种模式可以用一条命令在多个对象上激发复杂的或递归的行为.这可以简化粘合性代码,使其更 ...
- C#设计模式(10)——组合模式(Composite Pattern)(转)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- C#设计模式:组合模式(Composite Pattern)
一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; ...
- 【GOF23设计模式】组合模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_组合模式.树状结构.杀毒软件架构.JUnite底层架构.常见开发场景 package com.test.composite ...
- 设计模式:组合模式(Composite)
定 义:将对象组合树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象使用具有一致性. 结构图: Component类: abstract class Component ...
- [设计模式] 8 组合模式 Composite
DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
组合模式 组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 如果有一个 ...
随机推荐
- DevOps之存储和数据库
唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <数据(Data)> 了解有关数据部分.涉及存储及数据库的概念:知识与技能的层次( ...
- 阿里巴巴Java规约插件试用
阿里Java开发规约Eclipse插件介绍 阿里巴巴集团配合<阿里巴巴Java开发手册>PDF终极版开发的IDE插件,目前包括IDEA插件.Eclipse插件. 安装 检查环境 插件要求: ...
- 理解HTTPS
总结HTTPS HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全, ...
- 张高兴的 UWP 开发笔记:应用内启动应用 (UWP Launch UWP)
需求:在 A 应用内启动 B 应用,如果 B 应用未安装则跳转应用商店搜索. 启动方式使用 Uri 启动,本文使用尽可能简单,并且能拿来直接用的代码.不涉及启动后的应用数据交互,如需深入了解,请戳 M ...
- [poj1644]放苹果
题目链接:http://poj.org/problem?id=1664 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5, ...
- 谈谈你对web标注和W3c的理解和认识
web标准简单来说可以分为结构.表现和行为.其中结构主要是有HTML标签组成.表现即指css样式表,通过css可以是页面的结构标签更具美感.行为是指页面和用户具有一定的交互,同时页面结构或者表现发生变 ...
- LeetCode 78. Subsets(子集合)
Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not ...
- python函数前篇
函数:函数是指将一组语句的集合通过一个函数名封装起来,要想执行这个函数,只需调用其函数名即可 函数特性: 减少重复代码 使程序变得可扩展 使程序变得易维护 什么是函数? 函数就是具备某一特定功能的工具 ...
- TCP协议的滑动窗口协议以及流量控制
参考资料 http://blog.chinaunix.net/uid-26275986-id-4109679.html http://network.51cto.com/art/201501/4640 ...
- Leetcode题解(31)
103. Binary Tree Zigzag Level Order Traversal 题目 分析: 广度优先遍历的应用.重点是掌握vector的reverse函数,一开始我忘记有这个函数了,琢磨 ...