美文网首页
结构型设计模式->组合模式

结构型设计模式->组合模式

作者: liu66_net | 来源:发表于2018-12-07 10:05 被阅读0次
  • 目的

    1.一组对象与该对象的单个实例的处理方式一致。(理解的不是很明白)

  • 角色

    1.Component: 抽象构件,树形结构的根节点,为组合对象声明接口,也可以为共有接口实现缺省行为。(抽象类)
    2.leaf: 叶节点,该节点没有子节点,实现抽象构件所声明的接口(叶子)

    1. Compsite: 树形结构的树枝节点,该节点有子节点,实现抽象构件所声明的接口,存储子部件。(根,枝干)
  • 优点

    1.组合模式灵活性好

  • 缺点

    1.组合模式因为灵活性好,一个元素或组合在整个系统中可能被调用非常多次,但一旦某个元素或组合在系统中的一个节点出现问题,我们将很难排查到那个节点。

  • 代码1
<?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();


相关文章

网友评论

      本文标题:结构型设计模式->组合模式

      本文链接:https://www.haomeiwen.com/subject/kqfocqtx.html