@blog.justoneplanet.info

日々勉強

デザインパターン: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を実行して試してみてください。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment