Структурные паттерны в программировании на PHP
Структурные паттерны проектирования помогают организовать классы и объекты в более крупные структуры, обеспечивая гибкость и удобочитаемость кода. В PHP широко применяются следующие структурные паттерны:
1. Adapter (Адаптер)
Этот паттерн позволяет объекту с несовместимым интерфейсом работать с другим объектом без изменения его кода.
interface Target {
public function request(): string;
}
class Adaptee {
public function specificRequest(): string {
return "Ответ от Adaptee";
}
}
class Adapter implements Target {
private Adaptee $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request(): string {
return $this->adaptee->specificRequest();
}
}
$adaptee = new Adaptee();
$adapter = new Adapter($adaptee);
echo $adapter->request();
2. Bridge (Мост)
Разделяет абстракцию и реализацию, позволяя изменять их независимо друг от друга.
interface Implementor {
public function operation(): string;
}
class ConcreteImplementorA implements Implementor {
public function operation(): string {
return "Реализация A";
}
}
class ConcreteImplementorB implements Implementor {
public function operation(): string {
return "Реализация B";
}
}
class Abstraction {
protected Implementor $implementor;
public function __construct(Implementor $implementor) {
$this->implementor = $implementor;
}
public function operation(): string {
return $this->implementor->operation();
}
}
$abstraction = new Abstraction(new ConcreteImplementorA());
echo $abstraction->operation();
3. Composite (Компоновщик)
Позволяет работать с группами объектов так же, как с отдельными объектами.
interface Component {
public function operation(): string;
}
class Leaf implements Component {
public function operation(): string {
return "Лист";
}
}
class Composite implements Component {
private array $children = [];
public function add(Component $component): void {
$this->children[] = $component;
}
public function operation(): string {
$result = "Компонент: ";
foreach ($this->children as $child) {
$result .= $child->operation() . " ";
}
return trim($result);
}
}
$composite = new Composite();
$composite->add(new Leaf());
$composite->add(new Leaf());
echo $composite->operation();
4. Decorator (Декоратор)
Добавляет новое поведение объекту без изменения его структуры.
interface Component {
public function operation(): string;
}
class ConcreteComponent implements Component {
public function operation(): string {
return "Базовый компонент";
}
}
class Decorator implements Component {
protected Component $component;
public function __construct(Component $component) {
$this->component = $component;
}
public function operation(): string {
return $this->component->operation();
}
}
class ConcreteDecorator extends Decorator {
public function operation(): string {
return "Расширенный " . parent::operation();
}
}
$decorated = new ConcreteDecorator(new ConcreteComponent());
echo $decorated->operation();
5. Facade (Фасад)
Предоставляет простой интерфейс для сложной системы классов.
class SubsystemA {
public function operationA(): string {
return "SubsystemA: Operation A";
}
}
class SubsystemB {
public function operationB(): string {
return "SubsystemB: Operation B";
}
}
class Facade {
private SubsystemA $subsystemA;
private SubsystemB $subsystemB;
public function __construct() {
$this->subsystemA = new SubsystemA();
$this->subsystemB = new SubsystemB();
}
public function operation(): string {
return $this->subsystemA->operationA() . " | " . $this->subsystemB->operationB();
}
}
$facade = new Facade();
echo $facade->operation();
Полезные ссылки
- Design Patterns in PHP
- PHP: The Right Way
- Adapter Pattern in PHP
- Decorator Pattern in PHP
- Bridge Pattern in PHP
- Composite Pattern in PHP
- Facade Pattern in PHP
- Structural Patterns Overview
- Design Patterns in PHP
- PHP: The Right Way
- Adapter Pattern in PHP
- Decorator Pattern in PHP
Заключение
Структурные паттерны помогают улучшить организацию кода, обеспечивая гибкость и масштабируемость. Выбор паттерна зависит от конкретных требований:
- Adapter – для совместимости несовместимых интерфейсов.
- Bridge – для разделения абстракции и реализации.
- Composite – для работы с деревьями объектов.
- Decorator – для динамического расширения возможностей объекта.
- Facade – для упрощения сложных систем.
Использование этих паттернов делает код более чистым, поддерживаемым и расширяемым!