PHP Composite 模式簡易範例

Written by Simon Asika on

img

本篇文章用非常簡單的範例來示範一個採用 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 的應用會更容易。

Control Tools

WS-logo