Compositeパターンメモ
単体オブジェクトである葉と葉や枝を持つことができる枝オブジェクトを同様に扱うことができる。 ディレクトリツリーのような再帰的なデータ構造を表現できる。
/ 金額 : ¥ 2,940
このオブジェクト脳のつくり方では重要なパターンの一つとして取り上げられてました。 サンプルがJAVAですが、最初のほうはJAVAを知らない自分でも理解できるレベルで 書いてあるのでオススメです。
すみません自分は立ち読みです。いつかお金に余裕でたら買います。
クライアントはここで 宣言されたメソッド、プロパティのみを利用して プログラムを書く。
add()とview()は枝と葉で実装する。
abstract class CompositeAPI
{
private $name;
private $lv = null;
private $prefix = "■";
public function __construct($name, $lv)
{
$this->name = $name;
$this->lv = $lv;
}
public function getName()
{
return $this->name;
}
public function getLv()
{
return $this->lv;
}
public function getPrefix()
{
return $this->prefix;
}
public function getViewString()
{
return str_repeat($this->getPrefix(), $this->getLv()) . $this->name;
}
public abstract function add(CompositeAPI $obj);
public abstract function view();
}
枝にあたるクラス。 add()はCompositeAPIすなわち 枝も葉も格納できるようになっている。
view()は自分のプロパティ表示と、 格納された枝と葉のview()を呼び出す。
class Folder extends CompositeAPI
{
private $files = array();
public function __construct($name, $lv)
{
parent::__construct($name, $lv);
}
public function add(CompositeAPI $obj)
{
array_push($this->files, $obj);
}
public function view()
{
printf("<b>%s</b><br />", $this->getViewString());
foreach ($this->files as $file) {
$file->view();
}
}
}
葉にあたるクラス。 葉は枝も葉も持てないのでadd()は例外を発生させる。
class File extends CompositeAPI
{
public function __construct($name, $lv)
{
parent::__construct($name, $lv);
}
public function add(CompositeAPI $obj)
{
throw new Exception("error");
}
public function view()
{
printf("%s<br />", $this->getViewString());
}
}
function serch($target, Folder $current)
{
chdir($target);
foreach (glob("*") as $file) {
if (is_dir($target . $file)) {
$current->add($child = new Folder($file, $current->getLv() + 1));
serch($target . $file . DS, $child);
} elseif (is_file($target . $file)) {
$current->add(new File($file, $current->getLv()));
}
}
return $current;
}
$target = $_SERVER["DOCUMENT_ROOT"] . DS . "sample" . DS;
$root = new Folder("root", 0);
$tree = serch($target, $root);
$tree->view();
デザインパターン自体はなんとか理解できますが 実際に使えてるかというと全然使えてないのが現実。
愛読書である
/ 金額 : ¥ 3,150
に書かれてる
ができるようになるともっとわかりやすい 人に優しいスクリプトが書けるようになる気がする。
遠い道のりになりそうですが・・・
1-5
6-10