デザインパターン:Composite(複合)
■趣旨
サンプルソースです。ツリー構造を実現するパターンです。ノードとなるクラスを定義し、そのサブクラスとして、子要素を持つクラスと、子要素を持たないクラス(葉)を実装します。
■DirectoryFile.class.php
<?php
abstract class DirectoryFile {
protected $name;
public function __construct($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
abstract public function add(DirectoryFile $child);
abstract public function remove (DirectoryFile $child);
abstract public function getChildren();
abstract public function display($level);
}
class File extends DirectoryFile {
public function add(DirectoryFile $child){
echo('File cannot have any elements.');
return null;
}
public function remove(DirectoryFile $child){
echo('File don\'t have any elements.');
return null;
}
public function getChildren(){
return null;
}
public function display($level){
echo(str_repeat("\t", $level) . $this->name . "\n");
}
}
class Dir extends DirectoryFile {
private $files;
public function __construct($name){
parent::__construct($name);
$this->files = array();
}
public function add(DirectoryFile $child){
$this->files[] = $child;
return $this;
}
public function remove(DirectoryFile $child){
return array_splice($this->files, array_search($child, $files, true), 1);
}
public function getChildren(){
return $this->files;
}
public function display($level){
echo(str_repeat("\t", $level) . $this->name. "\n");
foreach($this->files as $child){
$child->display($level + 1);
}
}
}
?>
■sample.php
<?php
require_once('DirectoryFile.class.php');
$root = new Dir('root');
$dir0 = new Dir('dir0');
$dir1 = new Dir('dir1');
$root->add($dir0)->add($dir1);
$file00 = new File('file00');
$file01 = new File('file01');
$dir0->add($file00)->add($file01);
$dir10 = new Dir('dir10');
$file10 = new File('file10');
$dir1->add($dir10)->add($file10);
$file101 = new File('file101');
$file102 = new File('file102');
$dir1->add($file101)->add($file102);
$root->display(0);
?>
■あとがき
素敵なソースを見つけたので・・・結果はsample.phpを実行して試してみてください。
TrackBack URL :
Comments (0)