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>
*/
TrackBack URL :
Comments (0)
コメントはまだありません»
コメントはまだありません。
この投稿へのコメントの RSS フィード。TrackBack URL
コメントする