组合模式适应于当我们的一个对象可能代表一个单一的实体,或者一个组合实体,但是仍然需要通过同样的方式被使用的情形
组合和聚合都描述了一个类长期持有其他类的一个或多个实例的情况。
聚合:被包含对象是容器的核心部分,但是他们也可以被其他对象所包含。聚合关系用一条以空心菱形开头的线来说明。
组合:被包含的对象只能被它的容器所引用。当容器被删除时,它也应该被删除。组合关系的菱形是实心的。
<?php /** *File name: WorkUnit.php *Created by: ShowJoy *Contact: 734578348@qq.com, xubiao522@gmail.com *Last modified: 2014-5-24 */ abstract class WorkUnit{ protected $tasks = array(); protected $name = NULL; function __construct($name){ $this->name = $name; } function getName(){ return $this->name; } abstract function add(Employee $e); abstract function remove(Employee $e); abstract function assignTask($task); abstract function completeTask($task); } class Team extends WorkUnit{ private $_employees = array(); function add(Employee $e){ $this->_employees[] = $e; echo "<p>{$e->getName()} has been added to team {$this->getName()}.</p>"; } function remove(Employee $e){ $index = array_search($e, $this->_employees); unset($this->_employees[$index]); echo "<p>{$e->getName()} has been removed from team {$this->getName()}.</p>"; } function assignTask($task){ $this->tasks[] = $task; echo "<p>A new task has been assigned to team {$this->getName()}. It should be easy to do with {$this->getCount()} team member(s).</p>"; } function completeTask($task){ $index = array_search($task, $this->tasks); unset($this->tasks[$index]); echo "<p>The ‘$task‘ task has been completed by team {$this->getName()}.</p>"; } function getCount(){ return count($this->_employees); } } class Employee extends WorkUnit{ function add(Employee $e){ return false; } function remove(Employee $e){ return false; } function assignTask($task){ $this->tasks[] = $task; echo "<p>A new task has been assigned to {$this->getName()}. It will be done by {$this->getName()} alone.</p>"; } function completeTask($task){ $index = array_search($task, $this->tasks); unset($this->tasks[$index]); echo "<p>The ‘$task‘ task has been completed by employee {$this->getName()}.</p>"; } } ?
<?php /** *File name: compsite.php *Created by: ShowJoy *Contact: 734578348@qq.com, xubiao522@gmail.com *Last modified: 2014-5-24 */ require ‘WorkUnit.php‘; $team = new Team(‘showjoy‘); $e1 = new Employee(‘xu‘); $e2 = new Employee(‘biao‘); $e3 = new Employee(‘god‘); $team->add($e1); $team->add($e2); $team->add($e3); $team->assignTask(‘do something by team‘); $e1->assignTask(‘do it alone‘); $team->completeTask(‘do something by team‘);
$e1->completeTask(‘do it alone‘);
unset($team,$e1,$e2,$e3); ?>