Какой паттерн подходит для этого?

Необходимо как-то связать кучу классов, которые бы форматировали код и возвращали его. При этом точка входа у него должна быть одна.

Что-то типа этого:
FormatterInterface
interface FormatterInterface
{
    public function format($data, $type);
}

Formatter
class 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 их будет очень много.

Как я понял всё классы надо связать интерфейсом
  • Вопрос задан
  • 544 просмотра
Пригласить эксперта
Ответы на вопрос 2
oxyberg
@oxyberg
Продуктовый дизайнер ВКонтакте
Я думаю подойдет паттерн Фасад, который обеспечит единую точку входа компоненту.
Ответ написан
Комментировать
kpa6uu
@kpa6uu
Программист Талибана [Пыхерский Алибаба]
Стратегия решит проблему.
Каждый форматтер - отдельный класс. Все они реализуют один интерфейс.
Получать их можно через фабрику, в которой реализован кэш экземпляров объектов.

<?php

class FormatterFactory
{
	const TRAFFIC = 1;
	const CONVERSION = 2;

	protected static $cache = array();

	public static function get($formatterId)
	{
		if (static::isInCache($formatterId)) {
			return static::getFromCache($formatterId);
		}

		$formatter = static::createNewFormatter($formatterId);
		static::setToCache($formatterId, $formatter);

		return static::getFromCache($formatterId);
	}

	protected static function createNewFormatter($formatterId)
	{
		switch ($formatterId) {
			case static::TRAFFIC:
				$object = new TrafficFormatter();
				break;

			case static::CONVERSION:
				$object = new ConversionFormatter();
				break;

			default:
				throw new Exception("Unknown formatterId: {$formatterId}");
				break;
		}

		return $object;
	}

	protected static function isInCache($formatterId)
	{
		return isset(static::$cache[$formatterId]);
	}

	protected static function setToCache($formatterId, FormatterInterface $formatter)
	{
		static::$cache[$formatterId] = $formatter;
	}

	protected static function getFromCache($formatterId)
	{
		return isset(static::$cache[$formatterId]) ? static::$cache[$formatterId] : null;
	}
}

interface FormatterInterface
{
	public function format($data);
}

class TrafficFormatter implements FormatterInterface
{

	public function format($data)
	{
		return $data . 'traffic';
	}
}

class ConversionFormatter implements FormatterInterface
{
	public function format($data)
	{
		return $data . 'conversion';
	}
}

class Formatter
{
	/**
	 * @param FormatterInterface[] $formatters
	 * @param string $data
	 * @return string
	 */
	static public function format($formatters, $data)
	{
		foreach ($formatters as $formatter) {
			$data = $formatter->format($data);
		}

		return $data;
	}
}

$data = 'hello';

$data = Formatter::format(array(
	FormatterFactory::get(FormatterFactory::TRAFFIC),
	FormatterFactory::get(FormatterFactory::CONVERSION),
), $data);

echo $data; // hellotrafficconversion
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽