В чем ключевое различие между паттернами проектирования Фасад и Адаптер

Ответ

Оба паттерна являются структурными, но решают принципиально разные задачи: Фасад упрощает интерфейс, а Адаптер преобразует его.

Фасад (Facade)

Цель: Предоставить простой, единый интерфейс для сложной подсистемы. Он скрывает внутреннюю сложность и множество компонентов за одной "дверью".

Аналогия: Пульт управления "умным домом". Одна кнопка "Я ухожу" может выключить свет, закрыть шторы и активировать сигнализацию, скрывая взаимодействие с каждой из этих систем.

Пример (Python):

# Сложная подсистема
class VideoConverter:
    def convert(self, filename, format): ...

class AudioExtractor:
    def extract(self, filename): ...

class Uploader:
    def upload(self, file): ...

# Фасад, упрощающий работу
class MediaProcessingFacade:
    def __init__(self):
        self.video = VideoConverter()
        self.audio = AudioExtractor()
        self.uploader = Uploader()

    def process_and_upload(self, filename):
        print(f"Начинаем обработку файла {filename}")
        self.video.convert(filename, 'mp4')
        self.audio.extract(filename)
        self.uploader.upload(f"{filename}.mp4")
        print("Обработка завершена.")

# Клиентский код
facade = MediaProcessingFacade()
facade.process_and_upload("my_movie.mov")

Адаптер (Adapter)

Цель: Обеспечить совместную работу классов с несовместимыми интерфейсами. Он действует как переводчик между двумя объектами.

Аналогия: Переходник для розетки, который позволяет подключить американскую вилку (один интерфейс) к европейской розетке (другой интерфейс).

Пример (Python):

# Существующий класс с несовместимым интерфейсом
class OldLogger:
    def log_message(self, text):
        print(f"LOG: {text}")

# Новый стандартный интерфейс
class Logger:
    def info(self, message): ...

# Адаптер, который "подгоняет" OldLogger под новый интерфейс
class LoggerAdapter(Logger):
    def __init__(self, old_logger: OldLogger):
        self.old_logger = old_logger

    def info(self, message):
        # Преобразование вызова
        self.old_logger.log_message(message)

# Клиентский код работает с новым интерфейсом
logger = LoggerAdapter(OldLogger())
logger.info("Это сообщение будет записано через старый логгер.")

Ответ 18+ 🔞

А, паттерны, блядь! Фасад и Адаптер! Ну, это как сравнивать, ёпта, молоток и плоскогубцы — оба в ящике с инструментами, но херней разной занимаются, понимаешь?

Смотри, вот в чём, блядь, принципиальная разница, нахуй.

Фасад — это как твоя бабка, когда ты маленький приболел. Ему похуй, что там внутри организма творится: иммунитет, температура, сопли, блядь. Он тебе даёт одну таблетку (простенький интерфейс) и говорит: «Выпей, внучек, и всё пройдёт». А внутри-то, сука, целая химическая фабрика работает, печень ебётся, кровь гоняет — но тебе, пользователю, об этом думать не надо. Фасад упрощает, скрывая пиздец какую сложность.

Адаптер — это как, блядь, переходник для зарядки. У тебя новый телефон, а розетка старая, советская, ещё с ушами. И ты не можешь воткнуть, пиздец! Берёшь эту железяку-переходник (это и есть адаптер), вставляешь в розетку, а в него уже свою зарядку — и вуаля, работает! Адаптер не упрощает, он ПРЕОБРАЗУЕТ один интерфейс в другой, чтобы две разные хуйни смогли друг другу в сраку залезть.


Фасад (Facade) — «Одна кнопка на все случаи жизни»

Аналогия: Представь, блядь, умный дом. Ты перед уходом не бегаешь, выключая каждый хуй: свет в коридоре, чайник, телевизор, сигнализацию. Ты жмёшь одну, блядь, кнопку «Я ухожу» на панели (это фасад), и он сам всё делает. А внутри там провода, протоколы, микросхемы — целый ёперный театр! Но тебе-то похуй.

Пример (Python):

# Вот эта, блядь, сложная подсистема, в которой сам чёрт ногу сломит
class VideoConverter:
    def convert(self, filename, format): ...

class AudioExtractor:
    def extract(self, filename): ...

class Uploader:
    def upload(self, file): ...

# А это наш красавец-фасад. Он всех этих уродов спрятал за одной дверью.
class MediaProcessingFacade:
    def __init__(self):
        self.video = VideoConverter()
        self.audio = AudioExtractor()
        self.uploader = Uploader()

    def process_and_upload(self, filename):
        print(f"Начинаем обработку файла {filename}")
        self.video.convert(filename, 'mp4')   # Конвертнул
        self.audio.extract(filename)          # Звук выдрал
        self.uploader.upload(f"{filename}.mp4") # Загрузил
        print("Обработка завершена, иди нахуй.")

# И тебе, пользователю, теперь нихуя не надо знать. Вызвал один метод — и всё.
facade = MediaProcessingFacade()
facade.process_and_upload("my_movie.mov")

Вот и вся магия, блядь. Сложность спрятана, интерфейс простой — красота.


Адаптер (Adapter) — «Переводчик для двух идиотов, которые друг друга не понимают»

Аналогия: Вот есть у тебя, допустим, старый бензиновый генератор (старый класс). А купил ты новую, нахуй, стиральную машинку с евровилкой (новый интерфейс). И нихуя не подходит! Берёшь переходник (адаптер), вставляешь в генератор, а в него — вилку машинки. И она работает, хотя генератору похуй, что там стирается.

Пример (Python):

# Допустим, есть старый логгер, который все на проекте заебали, но он работает.
class OldLogger:
    def log_message(self, text):  # Смотри, метод называется по-другому!
        print(f"LOG: {text}")

# А тут пришёл новый архитектор и сказал: «Всё, блядь, теперь у нас везде новый стандартный интерфейс!»
class Logger:
    def info(self, message): ...  # А метод тут называется 'info'! Пиздец несовместимость!

# Что делать? Писать всё заново? Не, блядь, делаем адаптер!
class LoggerAdapter(Logger):
    def __init__(self, old_logger: OldLogger):
        self.old_logger = old_logger  # Засовываем старого пердуна внутрь

    def info(self, message):
        # А здесь мы, блядь, ПРЕОБРАЗУЕМ вызов. Говорим старому: «Эй, дед, вот тебе сообщение, запиши его своим способом!»
        self.old_logger.log_message(message)

# И теперь новый код спокойно работает со старым логгером, даже не подозревая, что тот древний, как говно мамонта.
logger = LoggerAdapter(OldLogger())
logger.info("Это сообщение пройдёт через адаптер, как говно через гуся.")

Итог, блядь:

  • Фасад — это «спрятать овердохуище сложности за одной простой кнопкой». Для клиента, который хочет просто результат.
  • Адаптер — это «заставить две разные системы, которые друг друга ненавидят, работать вместе». Для интеграции старого и нового, левого и правого.

Вот так вот, ёпта. Вроде оба структурные, а задачи у них, как у молотка и микроскопа — разные, блядь.