本篇文章用非常簡單的範例來示範一個採用 Composite 模式組織的聚合物件,通常這些聚合物件與被聚合的物件都有一樣的行為,只是聚合物件的行為是跟遍歷所有被聚合的物件執行相同的行為。
首先需要一個介面定義某物件的行為。
interface StudentInterface
{
public function doHomework();
}
建立一個 class 實現這個介面:
class Student implement StudentInterface
{
public function doHomework()
{
return 'homework';
}
}
好了,這是一個簡單的實現。現在我們建立一個學生群組,這樣可以一口要要求所有學生做作業,然後取回一整批作業(array),例如一個班級:
class Classroom implement StudentInterface
{
protected $students = array();
public function addStudent(StudentInterface $student)
{
$this->students[] = $student;
return $this;
}
public function doHomework()
{
$homeworks = array();
// Each get hoemworks from every student
foreach ($this->students as $student)
{
$homeworks[] = $student->doHomework();
}
return $homeworks;
}
}
現在,Classroom的用途很明確,依序加入多個 Student,然後執行 doHomework()
,我們就能一次取得所有 Student 所做的作業。
$classroom = new Classroom;
$classroom->addStudent(new Student)
->addStudent(new Student)
->addStudent(new Student)
->addStudent(new Student)
->addStudent(new Student);
$homeworks = $classroom->doHomework();
print_r($homeworks);
結果
Array
(
[0] => Homework
[1] => Homework
[2] => Homework
[3] => Homework
[4] => Homework
)
這就是一個非常簡單的 Composite 模式。說穿了其實也有點像裝飾模式,只是變成樹狀的而已。從這裡來理解更多其他的 Composite pattern 的應用會更容易。