Структурные паттерны в программировании

Структурные паттерны в программировании на 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();

Полезные ссылки

Заключение

Структурные паттерны помогают улучшить организацию кода, обеспечивая гибкость и масштабируемость. Выбор паттерна зависит от конкретных требований:

  • Adapter – для совместимости несовместимых интерфейсов.
  • Bridge – для разделения абстракции и реализации.
  • Composite – для работы с деревьями объектов.
  • Decorator – для динамического расширения возможностей объекта.
  • Facade – для упрощения сложных систем.

Использование этих паттернов делает код более чистым, поддерживаемым и расширяемым!

Recent blogs
Порождающие паттерны в программировании

Порождающие паттерны в программировании

Генераторы и итераторы в PHP

Генераторы и итераторы в PHP

Объектно-ориентированное программирование в PHP

Объектно-ориентированное программирование в PHP

Структуры данных в PHP

Структуры данных в PHP

HTTP-методы

HTTP-методы