|
オブジェクト指向についてはまだまだ勉強中ですが、「PHPでGoFのデザインパターンを実装したら、どんな感じになるんだろ?」と思ってしまったので、ちょっとずつやってみることにしました。
間違いやご意見がありましたら、遠慮なくツッコミを入れてくださいm(_"_)m
今回は、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ようにメソッドのオーバーライドが強制されないので、実装側で注意が必要です。
[2002/03/09] こちらに「abstractメソッドの実装を強制」させることについてまとめています
また、旧サイトのBBSにもDOMXML関数に似せた簡単なサンプルがあります。
|