孤独プログラマー譚

孤独死が近い。

デコレータパターンでテンプレートメソッドを使う(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();

 
 
 
うーん、引数でコールバックを渡すくらいしか、思いつかないなぁ。
ひとまず、この方法で使っていきます。