PHP でデザインパターン (Strategy)
PHP デザインパターン
Published: 2018-10-14

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());

参考