IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php-合成模式实现 -> 正文阅读

[PHP知识库]php-合成模式实现

php-合成模式实现

概述

将对象组合成树形结构以表示”部分-整体”的层次结构。Composite使用户对单个对象和组合对象的使用具有一致性。
Composite变化的是一个对象的结构和组成。

这里我们还是以摩托车制造厂,由于业务发展的非常赞,一个工厂已经无法满足业务需求,经高层讨论现需要将原来的工厂按制造的摩托车款式分为两个独立工厂(跨骑摩托车厂、踏板摩托车厂)。分别位于中国的广西省和广东省。两个工厂均设立独立的财务部门,行政部门,生产部门以及后勤部门。另设立一个总部在北京。总部主要设立行政、财务、售后三个部门。由于体系的膨胀,现在的需求是针对这个场景做一套erp管理系统。能够统一分配给各分公司使用。这个需求前景下我们就可以考虑使用合成模式实现。具体实现文章后面会讲到

模式结构

建造者模式包含如下角色:

以本文实例代码为参考

  1. CompanyBase - 组合模式抽象基类
  2. Company - 公司类
  3. Administrative - 行政部门
  4. Financial - 财务部门
  5. Production - 生产部门
  6. AfterSales - 售后部门
  7. Logistics - 后勤部门

图例

在这里插入图片描述

代码实例

<?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 Administrative 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 Financial 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 Production 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 AfterSales 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 Logistics 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>";
    }
}
$administrative = new Administrative("行政部门");
$financial = new Financial("财务部门");
$production = new Production("生产部门");
$logistics = new Logistics("后勤部门");
$afterSales = new AfterSales("售后部门");

//北京摩托公司
$companyBj = new Company("北京摩托公司");

$companyBj->add($administrative);
$companyBj->add($financial);
$companyBj->add($afterSales);

//广西摩托分公司
$companyGx = new Company("广西摩托分公司");
$companyGx->add($administrative);
$companyGx->add($financial);
$companyGx->add($production);
$companyGx->add($logistics);
$companyBj->add($companyGx);

//广东摩托分公司
$companyGd = new Company("广东摩托分公司");
$companyGd->add($administrative);
$companyGd->add($financial);
$companyGd->add($production);
$companyGd->add($logistics);
$companyBj->add($companyGd);

//使用公司功能
$companyBj->show();
$companyBj->work();

模式分析

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

模式优缺点

模式的优点
1、简化客户代码
2、使得更容易增加新类型的组件

模式的缺点

使你的设计变得更加一般化,容易增加组件也会产生一些问题,那就是很难限制组合中的组件

适用环境

1、你想表示对象的部分-整体层次结构
2、你希望用户忽略组合对象和单个对象的不同,用户将统一地使用组合结构中的所有对象。

获取更多学习资源请关注微信公众号:yuantanphp

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 08:48:43  更:2021-08-28 08:50:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:25:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码