Что такое паттерн проектирования «Фасад» (Facade)?

Ответ

Фасад (Facade) — это структурный паттерн проектирования, который предоставляет простой, унифицированный интерфейс к сложной подсистеме, состоящей из множества классов, библиотек или фреймворков.

Он скрывает внутреннюю сложность и делает взаимодействие с подсистемой более удобным, выступая в роли единой "точки входа".

Ключевая идея: Вместо того чтобы клиентский код напрямую взаимодействовал с десятками классов сложной системы, он обращается к одному объекту-фасаду, который делегирует вызовы нужным компонентам.

Пример на Python:

Представим сложную систему запуска компьютера, включающую процессор, память и жесткий диск. Фасад Computer упрощает эту операцию до одного метода start().

# 1. Сложная подсистема
class CPU:
    def freeze(self):
        print("CPU: Freezing...")
    def jump(self, position):
        print(f"CPU: Jumping to {position}...")
    def execute(self):
        print("CPU: Executing...")

class Memory:
    def load(self, position, data):
        print(f"Memory: Loading data '{data}' to {position}...")

class HardDrive:
    def read(self, lba, size):
        print(f"HardDrive: Reading {size} bytes from LBA {lba}...")
        return "boot_data"

# 2. Фасад
class Computer:
    def __init__(self):
        self.cpu = CPU()
        self.memory = Memory()
        self.hard_drive = HardDrive()

    def start(self):
        print("Computer: Starting...")
        self.cpu.freeze()
        boot_address = 0
        boot_data = self.hard_drive.read(lba=0, size=1024)
        self.memory.load(boot_address, boot_data)
        self.cpu.jump(boot_address)
        self.cpu.execute()
        print("Computer: Started successfully.")

# 3. Клиентский код
computer_facade = Computer()
computer_facade.start() # Клиенту нужен всего один вызов

Преимущества:

  • Изоляция сложности: Клиентский код не зависит от сложной внутренней реализации подсистемы.
  • Слабая связанность: Уменьшает количество зависимостей между клиентом и подсистемой.
  • Упрощение использования: Предоставляет простой и понятный API.

Недостатки:

  • Фасад может стать "божественным объектом", если он берет на себя слишком много ответственности и привязан ко всем классам системы.