KANTENNA.COM

Solarized

HOME > WEBプログラム覚書 > デザインパターン Composite

デザインパターン Composite

Compositeパターンメモ

単体オブジェクトである葉と葉や枝を持つことができる枝オブジェクトを同様に扱うことができる。 ディレクトリツリーのような再帰的なデータ構造を表現できる。

このオブジェクト脳のつくり方では重要なパターンの一つとして取り上げられてました。 サンプルがJAVAですが、最初のほうはJAVAを知らない自分でも理解できるレベルで 書いてあるのでオススメです。

すみません自分は立ち読みです。いつかお金に余裕でたら買います。

ディレクトリツリーを作る

abstract CompositeAPI.php

クライアントはここで 宣言されたメソッド、プロパティのみを利用して プログラムを書く。

add()とview()は枝と葉で実装する。

PHP
  1.  <?php
  2.  abstract class CompositeAPI
  3.  {
  4.   private $name;
  5.   private $lv = null;
  6.   private $prefix = "";
  7.  
  8.   public function __construct($name, $lv)
  9.   {
  10.   $this->name = $name;
  11.   $this->lv = $lv;
  12.   }
  13.  
  14.   public function getName()
  15.   {
  16.   return $this->name;
  17.   }
  18.  
  19.   public function getLv()
  20.   {
  21.   return $this->lv;
  22.   }
  23.  
  24.   public function getPrefix()
  25.   {
  26.   return $this->prefix;
  27.   }
  28.  
  29.   public function getViewString()
  30.   {
  31.   return str_repeat($this->getPrefix(), $this->getLv()) . $this->name;
  32.   }
  33.  
  34.   public abstract function add(CompositeAPI $obj);
  35.   public abstract function view();
  36.  }
  37.  ?>

Folder.php

枝にあたるクラス。 add()はCompositeAPIすなわち 枝も葉も格納できるようになっている。

view()は自分のプロパティ表示と、 格納された枝と葉のview()を呼び出す。

PHP
  1.  <?php
  2.  class Folder extends CompositeAPI
  3.  {
  4.   private $files = array();
  5.  
  6.   public function __construct($name, $lv)
  7.   {
  8.   parent::__construct($name, $lv);
  9.   }
  10.  
  11.   public function add(CompositeAPI $obj)
  12.   {
  13.   array_push($this->files, $obj);
  14.   }
  15.  
  16.   public function view()
  17.   {
  18.   printf("<b>%s</b><br />", $this->getViewString());
  19.  
  20.   foreach ($this->files as $file) {
  21.   $file->view();
  22.   }
  23.   }
  24.  }
  25.  ?>

Folder.php

葉にあたるクラス。 葉は枝も葉も持てないのでadd()は例外を発生させる。

PHP
  1.  <?php
  2.  class File extends CompositeAPI
  3.  {
  4.   public function __construct($name, $lv)
  5.   {
  6.   parent::__construct($name, $lv);
  7.   }
  8.  
  9.   public function add(CompositeAPI $obj)
  10.   {
  11.   throw new Exception("error");
  12.   }
  13.  
  14.   public function view()
  15.   {
  16.   printf("%s<br />", $this->getViewString());
  17.   }
  18.  }
  19.  ?>

クライアントコード

PHP
  1.  <?php
  2.  function serch($target, Folder $current)
  3.  {
  4.   chdir($target);
  5.  
  6.   foreach (glob("*") as $file) {
  7.   if (is_dir($target . $file)) {
  8.   $current->add($child = new Folder($file, $current->getLv() + 1));
  9.   serch($target . $file . DS, $child);
  10.   } elseif (is_file($target . $file)) {
  11.   $current->add(new File($file, $current->getLv()));
  12.   }
  13.   }
  14.  
  15.   return $current;
  16.  }
  17.  
  18.  $target = $_SERVER["DOCUMENT_ROOT"] . DS . "sample" . DS;
  19.  $root = new Folder("root", 0);
  20.  
  21.  $tree = serch($target, $root);
  22.  $tree->view();
  23.  ?>
実行結果
root
■file_find
■element.xsl
■foreach.xml
■■img
■■aoc_pak.gif
■■contact.jpg
■■ct_01.jpg
■■ct_02.jpg
■■ct_03.jpg
■■ct_04.jpg
■■lv2
■■foreach.xml
■■foreach.xsl
■■lv2file_find.php
■■■lv3
■■■test1.php
■■■test2.php
■■■test3.php
■■test.php
■■test.txt
■■test1.php
■■test2.php
■■test3.php
■test.php
■test.txt
■test1.php
■test2.php
■test3.php
■php
■■pg
■■session.php
■sidemenu
■index.php
■jquery.php
■jquery2.html
■menu.gif
■text
■passwd.txt
■xml
■■afi
■■job.xml
■element.xml
■element.xsl
■foreach.xml
■foreach.xsl
■■sitemap
■■sitemap.xml
■■web_design.xml

デザインパターン自体はなんとか理解できますが 実際に使えてるかというと全然使えてないのが現実。

愛読書である

PHPによるデザインパターン入門
作者:畑 勝也 | 価格:¥ 3,150

に書かれてる

  • 具体的なモノではなく抽象化されたモノを扱う。
  • インターフェイスに対してプログラムする。

ができるようになるともっとわかりやすい 人に優しいスクリプトが書けるようになる気がする。

遠い道のりになりそうですが・・・

トラックバック(2)

2010年2月13日 03:15

[PHP]これはPHP初心者は絶対読むべき!!・・・だとおもう、極上のリソース情報備忘録

これはPHP初心者は絶対読むべき!!・・・だとおもう、極上のリソース続きを読む

2012年1月25日 13:02

オブジェクト指向の間違った理解を正してくれた3つの言葉情報備忘録

オブジェクト指向の間違った理解を正してくれた3つの言葉続きを読む

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.08

[Ubuntu11.10]Winows XPユーザーがUbuntuを使ってみて

Windows XPとUbuntuのデュアルブート環境にしてみておもったこと。

2012
02.03

[jQuery]closest()とparents()

今から16年前Netscapeブラウザのソースコードの公開方法の会議の中で、初めてオープンソースという言葉が使われた今日、 みなさんいかがお過ごしでしょうか。

今回の投稿はそれとは関係のないjQueryのparents()とclosest()が 似てたので何が違うのか試した時のメモです。

2012
02.01

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

2012
02.01

[WordPress]管理画面のフッタのフィルタとアクション。

時間も時間なので、あまり使用頻度の高くない微妙なネタを。

会員制サイトなどで不特定多数の人にログインさせる場合、フッタのバージョン情報は隠しておきたかったり、 こじゃれたメッセージを表示したいときとか使うアクションとフィルタ。

2012
01.28

[WordPress] ブログの情報を取得する方法とノーキャッシュ疑惑

ブログのget_bloginfo()で取れないデータが必要な場合に使うもの。

2012
01.26

[jQuery Mobile]ダイアログ

jQuery Mobileにおけるダイアログの扱いはウインドウではなくページ。 なので通常のページと同様に扱える。ダイアログウインドウを出す。じゃなくダイアログページに遷移する。的な。

2012
01.25

[Ubuntu11.10]Ubuntuのインストール後の設定

インストール完了後の環境構築。PC起動時いちいちBIOSからブートドライブ選んで ブートするのかと思ってたら起動時にOS選択画面が出てくる。

すばらしいですね。

2012
01.24
2012
01.23

MinGW+Mintty+Git

MinGW+Mintty+Gitをやろうとして失敗に終わった。このエントリーには収穫できるものはありません。