Правильно ли я использую Декоратор в php? interface Output
{
public function getLinks($images);
}
class LinksOutput implements Output
{
public function getLinks($images)
{
uasort($images, function ($a, $b) {
return $a['width'] > $b['width'] ? 1 : -1;
});
$result = '';
foreach ($images as $val) {
$result .= "" . $val['link'] . " Ширина " . $val['width'] . "";
}
return $result;
}
}
class RedactOutput implements Output
{
protected $link;
public function __construct(Output $link)
{
$this->link = $link;
}
public function getLinks($images)
{
return '' . $this->link->getLinks($images) . '';
}
}
Скажите что нужно поправить и как лучше сделать.

21 Авг 2019 в 06:59
187 +1
1
Ответы
1

Декоратор в PHP используется для добавления функциональности к существующему объекту без изменения его структуры. В вашем коде вы правильно использовали декоратор, где класс RedactOutput добавляет теги к результату, возвращаемому методом getLinks класса LinksOutput.

Однако, для улучшения кода, можно предложить следующие улучшения:

В интерфейсе Output можно добавить абстрактный метод, который будет возвращать результат в виде строки. Это позволит более гибко реализовывать методы в декораторах.

Можно добавить типизацию аргументов и возвращаемого значения методов.

При создании объекта RedactOutput можно также добавить возможность изменять стиль текста с помощью параметра конструктора.

Рассмотрите возможность использования метода render вместо getLinks для возвращаемого результата.

Пример улучшенного кода:

interface Output
{
public function render($images): string;
}
class LinksOutput implements Output
{
public function render($images): string
{
uasort($images, function ($a, $b) {
return $a['width'] > $b['width'] ? 1 : -1;
});
$result = '';
foreach ($images as $val) {
$result .= "<pre>" . $val['link'] . "<br> Ширина " . $val['width'] . "<br>";
}
return $result;
}
}
class RedactOutput implements Output
{
protected $link;
protected $style;
public function __construct(Output $link, string $style = 'strong')
{
$this->link = $link;
$this->style = $style;
}
public function render($images): string
{
return '<' . $this->style . '>' . $this->link->render($images) . '</' . $this->style . '>';
}
}

Вышеуказанные улучшения помогут сделать код более гибким и читаемым.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир