Правильно ли я использую Декоратор в 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
218 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир