Статья
Шаблон проектирования "Стратегия"

Шаблон проектирования "Стратегия"

4 декабря 2017

Используется, чтобы разделить стратегии и получить возможность быстрого переключения между ними.
Рассмотрим сортировку списка объектов, где одна стратегия сортирует по id, другая - по названию.

interface ComparatorInterface
{
    public function compare($a, $b);
}

class IdComparator implements ComparatorInterface
{
    public function compare($a, $b)
    {
        return $a['id'] <=> $b['id'];
    }
}

class TitleComparator implements ComparatorInterface
{
    public function compare($a, $b)
    {
        return $a['title'] <=> $b['title'];
    }
}

class CitiesCollection
{
    private $cities;

    private $comparator;

    public function __construct($cities = [])
    {
        $this->cities = $cities;
    }

    public function setComparator(ComparatorInterface $comparator)
    {
        $this->comparator = $comparator;
    }

    public function sort(): array
    {
        if (!$this->comparator) {
            throw new \Exception('Comparator is not set');
        }

        uasort($this->cities, [$this->comparator, 'compare']);

        return $this->cities;
    }
}

 

Использование:

$cities = [['id' => 2, 'title' => 'Moscow'], ['id' => 4, 'title' => 'Kaliningrad'], ['id' => 3, 'title' => 'Barcelona']];

$obj = new CitiesCollection($cities);
$obj->setComparator(new IdComparator());
$results = $obj->sort(); // [['id' => 2, 'title' => 'Moscow'], ['id' => 3, 'title' => 'Barcelona'], ['id' => 4, 'title' => 'Kaliningrad']]

$obj->setComparator(new TitleComparator());
$results = $obj->sort(); // [['id' => 3, 'title' => 'Barcelona'], ['id' => 4, 'title' => 'Kaliningrad'], ['id' => 2, 'title' => 'Moscow']]



Источники:

http://designpatternsphp.readthedocs.io/ru/latest/Behavioral/Strategy/README.html
https://habrahabr.ru/company/mailru/blog/325492/