@blog.justoneplanet.info

日々勉強

PHPでデザインパターン:TemplateMethod(テンプレートメソッド)

メリットは「共通処理をまとめ具体的な処理をサブクラスに実装させられる」こと。

■コード

以下のように共通処理を定義する。具体的な処理が必要な部分は抽象メソッドにしておき、それらをdisplayからコールするようにする。

abstract class Display
{
    private $_data;
    public function __construct($data)
    {
        $this->_data = $data;
    }
    public function getData()
    {
        return $this->_data;
    }
    public function display()
    {
        $this->header();
        $this->body();
        $this->footer();
    }
    abstract protected function header();
    abstract protected function body();
    abstract protected function footer();    
}

以下のようにDisplayクラスを継承したクラス(DisplayAsPlain、DisplayAsList)を定義し、それぞれに具体的(⇔抽象)な処理を記述する。

class DisplayAsPlain extends Display
{
    protected function header(){}
    protected function body()
    {
        foreach($this->getData() as $key => $value){
            print("{$key} {$value}\n");
        }
    }
    protected function footer(){}
}

class DisplayAsList extends Display
{
    protected function header()
    {
        print("<ul>\n");
    }
    protected function body()
    {
        foreach($this->getData() as $key => $value){
            print("<li>{$key}: {$value}</li>\n");
        }
    }
    protected function footer()
    {
        print('</ul>');
    }
}

新しい表示形式を加えたい場合は、Displayを継承したクラスを作ってあげればよい。

クライアントコード

$data = array(
    'John' => 'banker',
    'Mike' => 'driver',
    'Nick' => 'scientist'
);
$plain = new DisplayAsPlain($data);
$plain->display();
/*
John banker
Mike driver
Nick scientist
*/
$list = new DisplayAsList($data);
$list->display();
/*
<ul>
<li>John: banker</li>
<li>Mike: driver</li>
<li>Nick: scientist</li>
</ul>
*/

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

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment