设计模式之组合模式(Composite)




设计模式组合模式:疑问

11-27

各位好,我看了《大话设计模式》中的组合模式,示例中是建立了三个类:rn1、Company抽象类:定义了公司的名称属性name,和一组抽象操作:add remove displayrn2、ConcreteCompany具体公司类:定义了一个children属性,用来存放子节点,并定义了和面三个方法的实现rn3、HRDepartment部门类:ConcreteCompany类一样,只是覆写了方法rnrn2和3都继承自1。rnrn我照示例做了之后,发现用起来好麻烦,于是,我自己建立了一个类:rnCompany:定义属性name,属性children,和同样的三个操作。rn也能同样实现组合模式的效果。rnrn所以,我这样做,有问题吗?我真不知道区别在哪!!!rn上我的代码:rn[code=php]rnclass Company rn protected $name; //单位名称,或部门名称rn protected $children = array(); //存储子节点rnrn public function __construct($name) //实例化时传入名称rn $this->name = $name;rn rnrn public function add(Company $test) //添加子节点rn $this->children[] = $test;rn rnrn public function display($depth) //显示结构rn echo str_pad('-', $depth, '-', STR_PAD_LEFT).$this->name.' ';rnrn foreach($this->children as $child) rn $child->display($depth+1);rn rn rnrnrn$root = new Company('总公司');rn$sub1 = new Company('分公司1');rn$sub1->add(new Company('部门1'));rn$sub1->add(new Company('部门2'));rn$root->add($sub1);rn$root->display(1);[/code]rnrn下面是大话中的代码:rn[code=php]rnabstract class Company rn protected $name;rnrn public function __construct($name) rn $this->name = $name;rn rnrn public abstract function Add(Company $c);rn public abstract function Display($depth);rnrnrnclass ConcreteCompany extends Company rn private $children = array();rnrn public function Add(Company $c) rn $this->children[] = $c;rn rnrn public function Display($depth) rn echo str_pad('-', $depth, '-', STR_PAD_LEFT).$this->name.' ';rn foreach($this->children as $child) rn $child->Display($depth+1);rn rn rnrnrnclass HRDepartment extends Company rn public function Add(Company $c) rnrn public function Display($depth) rn echo str_pad('-', $depth, '-', STR_PAD_LEFT).$this->name.' ';rn rnrn$root = new ConcreteCompany('总公司');rn$sub1 = new ConcreteCompany('分公司1');rn$sub1->Add(new HRDepartment('部门1'));rn$sub1->Add(new HRDepartment('部门2'));rn$root->Add($sub1);rn$root->Display(1);[/code]rnrn两种代码显示的结果一样:rn[code=html]rn-总公司rn--分公司1rn---部门1rn---部门2rn[/code]rnrn请教各位,这两种代码哪种好?理由呢?

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试