注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

php开发lamp

《西安--木木》-经历丰富了生活。 架构师QQ群: 246695517

 
 
 

日志

 
 

组合模式Composite  

2018-03-12 14:24:20|  分类: 设计模式--php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
php设计模式 php组合模式Composite

<?php
/**
* 组合模式Composite
*/

/**
* 组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。
* 组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,
* 组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。
*/
//抽象文件类:抽象构件
abstract class AbstractFile
{
public abstract function add(AbstractFile $file);

public abstract function remove(AbstractFile $file);

public abstract function getChild($i);

public abstract function killVirus();
}

//图像文件类:叶子构件
class ImageFile extends AbstractFile
{
private $name = '';

public function __construct($name)
{
$this->name = $name;
}

public function add(AbstractFile $file)
{
print("对不起,不支持该方法!");
}

public function remove(AbstractFile $file)
{
print("对不起,不支持该方法!");
}

public function getChild($i)
{
print("对不起,不支持该方法!");
return null;
}

public function killVirus()
{
//模拟杀毒
print("----对图像文件'" . $this->name . "'进行杀毒<br/>");
}
}

//文本文件类:叶子构件
class TextFile extends AbstractFile
{
private $name = '';

public function __construct($name)
{
$this->name = $name;
}

public function add(AbstractFile $file)
{
print("对不起,不支持该方法!");
}

public function remove(AbstractFile $file)
{
print("对不起,不支持该方法!");
}

public function getChild($i)
{
print("对不起,不支持该方法!");
return null;
}

public function killVirus()
{
//模拟杀毒
print("----对文本文件'" . $this->name . "'进行杀毒<br/>");
}
}

//视频文件类:叶子构件
class VideoFile extends AbstractFile
{
private $name = '';

public function __construct($name)
{
$this->name = $name;
}

public function add(AbstractFile $file)
{
print("对不起,不支持该方法!");
}

public function remove(AbstractFile $file)
{
print("对不起,不支持该方法!");
}

public function getChild($i)
{
print("对不起,不支持该方法!");
return null;
}

public function killVirus()
{
//模拟杀毒
print("----对视频文件'" . $this->name . "'进行杀毒<br/>");
}
}

//文件夹类:容器构件
class Folder extends AbstractFile
{
//定义集合fileList,用于存储AbstractFile类型的成员
private $fileList = array();
private $name = '';

public function __construct($name)
{
$this->name = $name;
}

public function add(AbstractFile $file)
{
$this->fileList[] = $file;
}

public function remove(AbstractFile $file)
{
//删除对象
if (in_array($file, $this->fileList)) {
foreach ($this->fileList as $k => $v) {
if ($v == $file) {
$this->fileList[$k];
}
}
}
}

public function getChild($i)
{
return $this->fileList[$i];
}

public function killVirus()
{
print("****对文件夹'" . $this->name . "'进行杀毒<br/>"); //模拟杀毒

//递归调用成员构件的killVirus()方法
foreach ($this->fileList as $k => $v) {
$v->killVirus();
}
}
}

//客户端

$folder1 = new Folder("Sunny的资料");
$folder2 = new Folder("图像文件");
$folder3 = new Folder("文本文件");
$folder4 = new Folder("视频文件");

$file1 = new ImageFile("小龙女.jpg");
$file2 = new ImageFile("张无忌.gif");
$file3 = new TextFile("九阴真经.txt");
$file4 = new TextFile("葵花宝典.doc");
$file5 = new VideoFile("笑傲江湖.rmvb");

$folder2->add($file1);
$folder2->add($file2);
$folder3->add($file3);
$folder3->add($file4);
$folder4->add($file5);
$folder1->add($folder2);
$folder1->add($folder3);
$folder1->add($folder4);

//从“Sunny的资料”节点开始进行杀毒操作
$folder1->killVirus();


/**
* 透明组合模式与安全组合模式
*
* 透明组合模式:将叶子构件的add()、remove()等方法的实现代码移至AbstractFile类中,
* 由AbstractFile提供统一的默认实现
*
* 安全组合模式:抽象构件AbstractFile中不声明任何用于访问和管理成员构件的方法
*/


  评论这张
 
阅读(9)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018