Какой паттерн подходит для этого? Необходимо как-то связать кучу классов, которые бы форматировали код и возвращали его. При этом точка входа у него должна быть одна.
Что-то типа этого: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
305 +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
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 96 340 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир