Strategy パターンとは
Strategyパターンでは、アルゴリズムの部分を他の部分と意識的に分離します。
Strategy パターンのメリット
- 処理毎にまとめることができる
- 異なる処理を選択するための条件文がなくなる
- 異なる処理を動的に切り替えることができる
実装例
<?php
abstract class ReadItemDataStrategy
{
private $filename;
public function __construct($filename)
{
$this->filename = $filename;
}
public function getData()
{
return $this->readData($this->getFileName());
}
public function getFileName()
{
return $this->filename;
}
protected abstract function readData($filename);
}
class ReadFixedLengthDataStrategy extends ReadItemDataStrategy
{
protected function readData($filename)
{
// MEMO: 実際は読み込みの処理を実装する
$data = [];
$data[] = self::class;
$data[] = sprintf('このファイルを読み込みます: %s', $filename);
return $data;
}
}
class ReadTabSeparatedDataStrategy extends ReadItemDataStrategy
{
protected function readData($filename)
{
// MEMO: 実際は読み込みの処理を実装する
$data = [];
$data[] = self::class;
$data[] = sprintf('このファイルを読み込みます: %s', $filename);
return $data;
}
}
class ItemDataContext
{
private $strategy;
public function __construct(ReadItemDataStrategy $strategy)
{
$this->strategy = $strategy;
}
public function getItemData()
{
return $this->strategy->getData();
}
}
$strategy1 = new ReadFixedLengthDataStrategy('dummy1.txt');
$context1 = new ItemDataContext($strategy1);
var_dump($context1->getItemData());
echo "\n";
$strategy2 = new ReadTabSeparatedDataStrategy('dummy2.txt');
$context2 = new ItemDataContext($strategy2);
var_dump($context2->getItemData());