Какой паттерн подходит для этого? Необходимо как-то связать кучу классов, которые бы форматировали код и возвращали его. При этом точка входа у него должна быть одна.
Что-то типа этого:FormatterInterfaceinterface FormatterInterface
{
public function format($data, $type);
}Formatterclass Formatter
{
static public function execute(FormatterInterface $formatter, $type, $data)
{
return $formatter->format($data, $type);
}
}PresetFormatter (таких классов будет уже куча)class PresetFormatter implements FormatterInterface
{
private $data;
private function traffic($data)
{
// тут код форматирования для traffic
}
private function conversion($data)
{
// тут код форматирования для conversion
}
public function format($data, $type)
{
switch ($type) {
case 'traffic':
$this->traffic($data);
break;
case 'conversion':
$this->conversion($data);
break;
}
return $this->data;
}
}Formatter::execute('PresetFormatter', 'traffic', [])
Все методы не получится указать в классе formater их будет очень много.
Как я понял всё классы надо связать интерфейсом

21 Авг 2019 в 07:01
448 +1
1
Ответы
1

Да, для решения данной задачи подойдет паттерн Стратегия (Strategy). Этот паттерн позволяет определять семейство алгоритмов, инкапсулировать каждый из них и делать их взаимозаменяемыми.

В вашем случае, вы можете создать интерфейс FormatterInterface с методом format, который будет реализован в каждом отдельном классе-стратегии (например, PresetFormatter). Класс Formatter будет иметь метод execute, который будет принимать объект реализующий интерфейс FormatterInterface и вызывать метод format у этого объекта.

Пример реализации:

// Интерфейс стратегии
interface FormatterInterface
{
public function format($data, $type);
}
// Класс выполняющий стратегию
class Formatter
{
static public function execute(FormatterInterface $formatter, $type, $data)
{
return $formatter->format($data, $type);
}
}
// Один из классов-стратегий
class PresetFormatter implements FormatterInterface
{
public function format($data, $type)
{
switch ($type) {
case 'traffic':
return $this->traffic($data);
case 'conversion':
return $this->conversion($data);
default:
return $data;
}
}
private function traffic($data)
{
// тут код форматирования для traffic
}
private function conversion($data)
{
// тут код форматирования для conversion
}
}
// Использование
$data = [];
$result = Formatter::execute(new PresetFormatter(), 'traffic', $data);
var_dump($result);

Таким образом, вы можете динамически выбирать необходимую стратегию форматирования, не привязываясь к конкретному классу форматтера.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир