PHP面向对象中的聚合和组合
对象之间进行交互主要有三种:继承,聚合,组合,继承大家都很熟悉,这里就不具体介绍了,本文主要介绍聚合和组合的一些内容。
聚合:可以理解成第二个对象通过第一个对象的某个方法传递给第一个对象,然后第二个对象就可以调用第一个对象的方法,第二个对象可以根据自己的目的使用第二个对象的功能;
组合:用于描述一个对象完全拥有另一个对象的情况,即第一个对象中实例化第二个对象,该方式最常用语,第一个对象唯一需要使用第二个对象。
该段代码演示聚合和组合
work.class.php(该文件同样被组合的例子使用)
<?php class Work { //声明两个属性 工作状态,和薪水 private $state; private $salary; //构造方法 public function __construct($state,$salary){ $this-> state=$state; $this-> salary=$salary; } //获取属性信息的函数 public function getInfo() { return $this-> state.$this->salary; } } ?>
life.class.php
//引入work类文件 require_once("work.class.php"); //定义Life 类文件 class Life { //声明属性 private $lifeWork; private $owner; private $liftZuhe; //构造函数 public function __construct($owner){ $this->owner=$owner; } //采用对象聚合的方式,将对象作为一个参数赋值给成员属性 public function addWorkToLife(Work $work) { $this->lifeWork[]= $work; } //显示所有的工作信息 public function displayWorks() { $workInfo="Juhe | ".$this->owner; //调用循环输出信息 foreach($this->lifeWork as $work) { $workInfo.= ' ' . $work->getInfo() ; } //返回结果值 return $workInfo; } //采用对象组合的方式,将对象直接实例化在方法内部 function showWorkLife() { $this->lifeZuhe = new work('xiaozhe',666); $returnValue = 'Zuhe | '.$this->owner.' | '.$this->lifeZuhe->getInfo() . '<br/>'; return $returnValue; } } //实例化一个Life对象 $life=new Life("Andy"); ////组合 echo $life->showWorkLife(); //聚合 //实例化两个Work对象 $work1=new Work('past',15); $work2=new Work("now",30); //调用life对象的addWorkToLife方法,添加Work对象 $life->addWorkToLife($work1); $life->addWorkToLife($work2); echo $life->displayWorks(); ?>
聚合与组合的比较:
1.何时使用聚合还是组合,通过回答“如果对象A消亡后,对象B还会存在吗?”,如果对象B在对象A消亡后继续存在,对象A应聚合对象B。但是当对象B和A一同消亡时,对象A应该组合对象B。当然还可以从对象B是否唯一被对象A所需要的情况。
2.聚合比组合管理负担小,因为在聚合中一个对象可以被其他多个对象共享。将数据库连接类进行聚合确实很不错。而组合数据库连接类会因为流量高而变慢。
3.组合使得类更容易使用。
4.聚合的问题,共享已聚合对象的某个对象可能会改变已聚合对象的状态,导致该对象无法在被希望使用它的其他类使用
5.组合会造成两个对象之间出现高度耦合,导致依赖性很高,这违背模块设计中的“高内聚,低耦合”的原则,使得重用更加困难。
总结:因此大家在使用聚合或者组合时需要根据自己的情况,综合以上几点选择使用那种方式处理两个对象之间的交互。