Sobes.tech
Middle

What is the facade pattern?

sobes.tech AI

Answer from AI

The "Facade" pattern is a structural design pattern that provides a simplified interface to a complex system of classes, libraries, or subsystems. It hides the details of the subsystem implementation and offers a single entry point for performing common operations.

Purpose:

  • Simplify the use of a complex system.
  • Reduce dependencies between the client and the subsystem.
  • Make the subsystem more flexible to changes.

Structure:

  • Facade: Provides a simple interface for the client. Delegates requests to the appropriate subsystem objects.
  • SubSystem Classes: Implement the functionality of the subsystem. They are unaware of the Facade.

Example in Python:

# Complex subsystem classes
class AudioMixer:
    def __init__(self):
        print("AudioMixer: Initializing...")

    def configure(self, type):
        print(f"AudioMixer: Configuring for {type}...")

    def set_volume(self, level):
        print(f"AudioMixer: Setting volume to {level}...")

class VideoRenderer:
    def __init__(self):
        print("VideoRenderer: Initializing...")

    def set_resolution(self, res):
        print(f"VideoRenderer: Setting resolution to {res}...")

    def render(self, frame):
        print(f"VideoRenderer: Rendering frame {frame}...")

class SubtitleManager:
    def __init__(self):
        print("SubtitleManager: Initializing...")

    def load(self, file):
        print(f"SubtitleManager: Loading subtitles from {file}...")

    def sync(self):
        print("SubtitleManager: Syncing subtitles...")

# Facade pattern
class VideoConverterFacade:
    def __init__(self):
        self._audio_mixer = AudioMixer()
        self._video_renderer = VideoRenderer()
        self._subtitle_manager = SubtitleManager()

    def convert_video(self, filename):
        print("\nVideoConverterFacade: Starting video conversion...")
        self._audio_mixer.configure("stereo")
        self._video_renderer.set_resolution("1080p")
        self._subtitle_manager.load(f"{filename}.srt")
        self._subtitle_manager.sync()
        for i in range(3): # Simulate frame processing
            self._video_renderer.render(i)
        self._audio_mixer.set_volume(5)
        print("VideoConverterFacade: Video conversion finished.\n")

# Client code
# Without the Facade, the client would have to interact
# directly with all subsystem classes.
# mixer = AudioMixer()
# renderer = VideoRenderer()
# subtitles = SubtitleManager()
# ... many lines of code for interaction ...

# With the Facade, the client interacts only with the Facade
facade = VideoConverterFacade()
facade.convert_video("my_movie")

When to use:

  • When you need to provide a simple interface to a complex subsystem.
  • When there are many dependencies between clients and subsystem classes.
  • To layer the subsystem.

Advantages:

  • Simplifies interaction with the subsystem.
  • Reduces coupling between the client and the subsystem.
  • Eases the modification or replacement of the subsystem.

Disadvantages:

  • The Facade can become a "God Object" if it includes too much functionality.
  • It may hide important details that advanced users of the subsystem might need.

Overall, the Facade is a convenient way to organize code and improve readability and ease of use of a complex system.