百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

设计模式-组合器模式

citgpt 2024-09-26 11:29 6 浏览 0 评论

欢迎大家关注哦~

组合模式(有时候又叫做部分-整体模式),将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

设计模式-组合器模式

三大角色:

抽象结构(Company)角色:此角色实现所有类共有接口的默认行为,声明一个接口管理子部件。

叶子节点(Technology)角色:表示叶子对象,没有子节点。

枝节点(SubCompany)角色:用来存储子部件,实现与子部件有关的操作,如Add()等。

<?php
/**
* Created by PhpStorm.
* User: Jiang
* Date: 2015/5/2
* Time: 21:14
*/
/**抽象结构角色 公司
* Class Company
*/
abstract class Company
{
protected $name;
function __construct($name)
{
$this->name=$name;
}
/**增加
* @param Company $company 子公司,部门
* @return mixed
*/
abstract function Add(Company $company);
/**移除
* @param Company $company 子公司,部门
* @return mixed
*/
abstract function Remove(Company $company);
/**显示公司及部门结构
* @param $depth
* @return mixed
*/
abstract function Display($depth);
}
/**枝节点 子公司
* Class Beijing
*/
class SubCompany extends Company
{
private $sub_companys=array();
function __construct($name)
{
parent::__construct($name);
}
function Add(Company $company)
{
$this->sub_companys[]=$company;
}
function Remove(Company $company)
{
$key=array_search($company,$this->sub_companys);
if($key!==false)
{
unset($this->sub_companys[$key]);
}
}
function Display($depth)
{
$pre="";
for($i=0;$i<$depth;$i++)
{
$pre.="-";
}
$pre.=$this->name."<br/>";
echo $pre;
foreach($this->sub_companys as $v)
{
$v->Display($depth+2);
}
}
}
/**叶子节点 财务部
* Class DeptCompany
*/
class MoneyDept extends Company
{
function __construct($name)
{
parent::__construct($name);
}
/**增加
* @param Company $company 子公司,部门
* @return mixed
*/
function Add(Company $company)
{
echo "叶子节点,不能继续添加节点。。。。。。。。。。<br/>";
}
/**移除
* @param Company $company 子公司,部门
* @return mixed
*/
function Remove(Company $company)
{
echo "叶子节点,不能删除节点。。。。。。。。。。<br/>";
}
/**显示公司及部门结构
* @param $depth
* @return mixed
*/
function Display($depth)
{
$pre="";
for($i=0;$i<$depth;$i++)
{
$pre.="-";
}
$pre.=$this->name."<br/>";
echo $pre;
}
}
/**叶子节点 技术部门
* Class DeptCompany
*/
class TechnologyDept extends Company
{
function __construct($name)
{
parent::__construct($name);
}
/**增加
* @param Company $company 子公司,部门
* @return mixed
*/
function Add(Company $company)
{
echo "叶子节点,不能继续添加节点。。。。。。。。。。<br/>";
}
/**移除
* @param Company $company 子公司,部门
* @return mixed
*/
function Remove(Company $company)
{
echo "叶子节点,不能删除节点。。。。。。。。。。<br/>";
}
/**显示公司及部门结构
* @param $depth
* @return mixed
*/
function Display($depth)
{
$pre="";
for($i=0;$i<$depth;$i++)
{
$pre.="-";
}
$pre.=$this->name."<br/>";
echo $pre;
}
}

测试代码:

header("Content-Type:text/html;charset=utf-8");
//------------------------组合器模式测试代码------------------
require_once "./Composer/Composer.php";
$root=new SubCompany("北京总公司");
$root->Add(new MoneyDept("总公司财务部"));
$root->Add(new TechnologyDept("总公司技术部"));
$shanghai=new SubCompany("上海分公司");
$shanghai->Add(new TechnologyDept("上海分公司技术部"));
$shanghai->Add(new MoneyDept("上海分公司财务部"));
$root->Add($shanghai);
$root->Display(1);
echo "<hr/>";
$root->Remove($shanghai);
$root->Display(3);

优势:

组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: