Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2005/05/30

counter hits
since 1999/11/06


PHP4でデザインパターン(Composite編)

オブジェクト指向についてはまだまだ勉強中ですが、「PHPでGoFのデザインパターンを実装したら、どんな感じになるんだろ?」と思ってしまったので、ちょっとずつやってみることにしました。

caution間違いやご意見がありましたら、遠慮なくツッコミを入れてくださいm(_"_)m

今回は、Compositeパターンで「再帰的な構造を作る」パターンです(以下のクラス図を参照)。

Compositeパターンのクラス図

今回のサンプルは、「組織と所属メンバー」のツリー構造をCompositeパターンを使って表現してみました。上のクラス図との関係は、

  • Component => Entry
  • Composite => Dept
  • Leaf => Emp

となります。なお、想定する組織は以下のようなものです。

サンプルの組織図

また、メンバーは以下の通りです。

  • 本社:シャチョー、ブチョー
  • ○○支店:支店長、佐々木さん
  • △△営業所:下岡さん
  • ××支店:畑さん、緒方さん

前置きが長くなりましたが、以下がサンプルコードです。

●Composite.php

<?php
class Entry
{
    var $id_;
    var $name_;

    function Entry($id, $name)
    {
        $this->id_ = $id;
        $this->name_ = $name;
    }

    function getId()
    {
        return $this->id_;
    }

    function getName()
    {
        return $this->name_;
    }

    /**
     * 子要素を追加する
     * 抽象メソッド(の意味)なので、子孫クラスで実装する
     */
    function add($node)
    {
    }

    /**
     * 組織ツリーを表示する
     * 今回は、デフォルトの実装を用意
     */
    function printTree()
    {
        echo $this->id_ . ":" . $this->name_ . "<br>\n";
    }
}

class Dept extends Entry
{
    var $entry_;

    function Dept($id, $name)
    {
        $this->Entry($id, $name);
        $this->entry_ = array();
    }

    /**
     * 子要素を追加する
     */
    function add($node)
    {
        array_push($this->entry_, $node);
        return $this;
    }

    /**
     * 再帰的にツリーを表示する
     */
    function printTree()
    {
        parent::printTree();
        foreach ($this->entry_ as $index => $node) {
            $node->printTree();
        }
    }

}

class Emp extends Entry
{
    function Emp($id, $name)
    {
        $this->Entry($id, $name);
    }
}
?>
<?php
    /**
     * ここからサンプルプログラム
     */

    //ツリーのデータを構築
    $root = new Dept("001", "本社");
    $root->add(new Emp("00101", "シャチョー"));
    $root->add(new Emp("00102", "ブチョー"));

    $dept1 = new Dept("010", "○○支店");
    $dept1->add(new Emp("01001", "支店長"));
    $dept1->add(new Emp("01002", "佐々木さん"));

    $dept2 = new Dept("110", "△△営業所");
    $dept2->add(new Emp("11001", "下岡さん"));
    $dept1->add($dept2);
    $root->add($dept1);

    $dept3 = new Dept("020", "××支店");
    $dept3->add(new Emp("02001", "畑さん"));
    $dept3->add(new Emp("02002", "緒方さん"));
    $root->add($dept3);

    //ツリーを表示してみる
    echo "●本社からのツリー<br>\n";
    $root->printTree();
    echo "<br>\n";
    echo "●○○支店からのツリー<br>\n";
    $dept1->printTree();
    echo "<br>\n";
    echo "●△△営業所からのツリー<br>\n";
    $dept2->printTree();
    echo "<br>\n";
    echo "●××支店からのツリー<br>\n";
    $dept3->printTree();
?>

●出力結果
●本社からのツリー
001:本社
00101:シャチョー
00102:ブチョー
010:○○支店
01001:支店長
01002:佐々木さん
110:△△営業所
11001:下岡さん
020:××支店
02001:畑さん
02002:緒方さん

●○○支店からのツリー
010:○○支店
01001:支店長
01002:佐々木さん
110:△△営業所
11001:下岡さん

●△△営業所からのツリー
110:△△営業所
11001:下岡さん

●××支店からのツリー
020:××支店
02001:畑さん
02002:緒方さん
  

PHPで実装する場合、Javaのabstractようにメソッドのオーバーライドが強制されないので、実装側で注意が必要です。

memo[2002/03/09] こちらに「abstractメソッドの実装を強制」させることについてまとめています

また、旧サイトのBBSにもDOMXML関数に似せた簡単なサンプルがあります。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2005 by Hideyuki SHIMOOKA all rights reserved.