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

Copper peas ' Bolg

Keep On Moving...This Is My Life...

 
 
 

日志

 
 

【原】 PHP 设计模式十二之组合设计模式  

2011-06-15 14:01:58|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?php
header("Content-type:text/html; charset=utf-8");
/**
 * 以现实中公司内各部门的层级关系为例 树形列表 组合设计模式
 * 定义:将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
 *
 * @anthor Chen Wei Han <csq-3@163.com>
 * @copyright Chen Wei Han 2011-6-14下午03:53:45
 * @link http://csq-3.blog.163.com
 * @package demo
 * @version 1.0 composite.php
 */

/**
 * 抽象公司角色类
 */
abstract class abstract_Company
{
     protected  $name;

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

        abstract public function Add($c);
        abstract public function Remove($c);
        abstract public function Display($depth);
        abstract public function LineOfDuty();
 
}

/**
 * 具体公司角色类(总公司,分公司)
 */
class ConcreteCompany extends abstract_Company
{
     private $children = array();      
    
        public function __construct($name)
        {
         parent::__construct($name);
        }

        public function Add($c)
        {         
         if (is_object($c))
         {
           $this->children[spl_object_hash($c)] = $c;       
         }
         else
         {
           $this->children[md5($c)]=$c; 
         }
        }

        public function Remove($c)
        {         
         if (is_object($c))
         {
          unset($this->children[spl_object_hash($c)]);
         }
         else
         {
          unset($this->children[md5($c)]);
         }
       
        }
        
        public function Display($depth)
        {           
            echo str_repeat('-', $depth).$this->name."</br>";
            foreach ($this->children as $value)
            {
                $value->Display($depth + 2);
            }
         
        }

        public function LineOfDuty()
        {
            foreach ($this->children as $value)
            {
                $value->LineOfDuty();
            }
         
        }
 
}

/**
 * HR部门
 */
class HRDepartment extends abstract_Company
{
     public function __construct($name)
     {
      parent::__construct($name);
     }

        public function  Add($c){}

        public function  Remove($c){}

        public function  Display($depth)
        {
            echo str_repeat('-', $depth).$this->name."</br>";
        }

        public function  LineOfDuty()
        {
            echo $this->name." 员工招聘<br>";
        }
 
}

/**
 * 财务部门
 */
class FinanceDepartment extends abstract_Company
{
        public function __construct($name)
     {
      parent::__construct($name);
     }

        public function  Add($c){}
       
        public function  Remove($c){}
       
        public function  Display($depth)
        {
            echo str_repeat('-', $depth).$this->name."</br>";
        }

        public function  LineOfDuty()
        {
            echo $this->name." 财务收支管理<br>";
        }
}


$root    = new ConcreteCompany("北京总公司");
$hr_root = new HRDepartment("总公司人力资源部");
$Fi_root = new FinanceDepartment("总公司财务部");

$root->Add($hr_root);
$root->Add($Fi_root);
//$root->Remove($hr_root);

$comp    = new ConcreteCompany("上海分公司");
$hr_comp = new HRDepartment("上海分公司人力资源部");
$Fi_comp = new FinanceDepartment("上海分公司财务部");
$comp->Add($hr_comp);
$comp->Add($Fi_comp);
//$root->Remove($Fi_comp);

$root->Add($comp);

echo ("结构图<br>");
$root->Display(1);
echo ("职责<br>");
$root->LineOfDuty();

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

历史上的今天

评论

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

页脚

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