デコレータパターンでテンプレートメソッドを使う(PHP)
うーん、今までデコレータパターンを勘違いしてた。
デコレータパターンは継承と書き換え可能でした。
デコレータは動的に継承っぽい関係を作れるので、その点メリットがあります。
ただ、どの程度書き換え可能なのか…?
自分はテンプレートメソッドをよく使うんですが、そういうこともデコレータは出来るのか…?
というわけで、デコレータパターンでテンプレートメソッドを再現してみました。
ひとまず、一旦、普通の継承を。
<?php class Super { public function render() { echo '<p>2</p>'; $this->tmplMethod(); echo '<p>4</p>'; } } class Child extends Super { public function render() { echo '<p>1</p>'; parent::render(); echo '<p>5</p>'; } public function tmplMethod() { echo '<p>3</p>'; } } $obj = new Child(); $obj->render();
こいつを、デコレータで書き換える。
親となるクラス。
<?php class Super { public function render(callable $callback) { echo '<p>2</p>'; $callback(); echo '<p>4</p>'; } }
子供のクラス。
<?php class Child { public function __construct(Super $super) { $this->super = $super; } public function render() { echo '<p>1</p>'; $this->super->render([$this, 'tmplMethod']); echo '<p>5</p>'; } public function tmplMethod() { echo '<p>3</p>'; } }
実行。
<?php $obj = new Child(new Super); $obj->render();
うーん、引数でコールバックを渡すくらいしか、思いつかないなぁ。
ひとまず、この方法で使っていきます。