Какой паттерн подходит для этого? Необходимо как-то связать кучу классов, которые бы форматировали код и возвращали его. При этом точка входа у него должна быть одна. Что-то типа этого: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 их будет очень много. Как я понял всё классы надо связать интерфейсом
Да, для решения данной задачи подойдет паттерн Стратегия (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);
Таким образом, вы можете динамически выбирать необходимую стратегию форматирования, не привязываясь к конкретному классу форматтера.
Да, для решения данной задачи подойдет паттерн Стратегия (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);
Таким образом, вы можете динамически выбирать необходимую стратегию форматирования, не привязываясь к конкретному классу форматтера.