主页 > PHP > PHP设计模式之组合设计模式

PHP设计模式之组合设计模式

2011 年 09 月 27 日 没有评论
<?php 
/**
 * 组合模式
 * @desc 组合模式(Composite):将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和
 *    组合对象的使用具有一致性。
 *          使用场景: 当发现需求中是体现部分与整体层次的结构时,以及希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构
 *    中的所有对象时。
 *  @author perisky
 */

//公司类  抽象类及接口
abstract class Company {
    protected $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public abstract function add($company);            //增加
    public abstract function remove($company);        //移除
    public abstract function display($depth);        //显示
}

//具体公司类
class ConcreteCompany extends Company {
    private $_companyList = array();
    
    public function add($company) {
        $unique = substr(md5(serialize($company)), 0, 3);
        $this->_companyList[$unique] = $company;
    }
    
    public function remove($company) {
        $unique = substr(md5(serialize($company)), 0, 3);
        unset($this->_companyList[$unique]);
    }
    
    public function display($depth) {
        $rst = str_repeat('-', $depth);
        echo $rst.$this->name."\r\n</br>";
        foreach ($this->_companyList as $v) {                        
            $v->display($depth+2);            
        }
    }
}

//人力资源部
class HRDepartment extends Company {
    public function add($company) {    
        return '';
    }
    
    public function remove($company) { 
        return '';
    }
    
    public function display($depth) {    
        $rst  =  str_repeat('-', $depth);
        $rst .=  $this->name."\r\n</br>";
        echo $rst;
    }
}

//财务部
class FinanceDepartment extends Company {
    public function add($company) {
        return '';
    }
    
    public function remove($company) { 
        return '';
    }
    
    public function display($depth) {    
        $rst  =  str_repeat('-', $depth);
        $rst .=  $this->name."\r\n</br>";
        echo $rst;
    }
}


$root = new ConcreteCompany('成都总公司');
$root->add(new HRDepartment('总公司人力资源部'));
$root->add(new FinanceDepartment('总公司财务部'));

$comp1 = new ConcreteCompany('广元分公司');
$comp1->add(new HRDepartment('广元分公司人力资源部'));
$comp1->add(new FinanceDepartment('广元分公司财务部'));
$root->add($comp1);

$comp2 = new ConcreteCompany('南充分公司');
$comp2->add(new HRDepartment('南充分公司人力资源部'));
$comp2->add(new FinanceDepartment('南充分公司财务部'));
$root->add($comp2);

$comp3 = new ConcreteCompany('苍溪办事处');
$comp3->add(new HRDepartment('苍溪办事处人力资源部'));
$comp3->add(new FinanceDepartment('苍溪办事处财务部'));
$comp1->add($comp3);

$root->display(1);

页面显示效果:
-成都总公司
—总公司人力资源部
—总公司财务部
—广元分公司
—–广元分公司人力资源部
—–广元分公司财务部
—–苍溪办事处
——-苍溪办事处人力资源部
——-苍溪办事处财务部
—南充分公司
—–南充分公司人力资源部
—–南充分公司财务部

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>