Middle
Čo je to vzor fasády (Facade)?
sobes.tech AI
Odpoveď od AI
Vzor "Fasáda" je štrukturální návrhový vzor, ktorý poskytuje zjednodušené rozhranie ku komplexnému systému tried, knižnici alebo podsystému. Skrýva detaily implementácie podsystému a poskytuje jedno vstupné miesto na vykonávanie štandardných operácií.
Cieľ:
- Zjednodušiť používanie zložitých systémov.
- Znížiť závislosti medzi klientom a podsystémom.
- Umožniť väčšiu flexibilitu podsystému voči zmenám.
Štruktúra:
- Fasáda (Facade): Poskytuje jednoduché rozhranie pre klienta. Deleguje požiadavky na príslušné objekty podsystému.
- Triedy podsystému (SubSystem Classes): Implementujú funkcionalitu podsystému. Nie sú oboznámené s Fasádou.
Príklad v Pythone:
# Triedy zloženého podsystému
class AudioMixer:
def __init__(self):
print("AudioMixer: Inicializácia...")
def configure(self, type):
print(f"AudioMixer: Konfigurácia pre {type}...")
def set_volume(self, level):
print(f"AudioMixer: Nastavenie hlasitosti na {level}...")
class VideoRenderer:
def __init__(self):
print("VideoRenderer: Inicializácia...")
def set_resolution(self, res):
print(f"VideoRenderer: Nastavenie rozlíšenia na {res}...")
def render(self, frame):
print(f"VideoRenderer: Renderovanie snímky {frame}...")
class SubtitleManager:
def __init__(self):
print("SubtitleManager: Inicializácia...")
def load(self, file):
print(f"SubtitleManager: Načítanie titulkov zo súboru {file}...")
def sync(self):
print("SubtitleManager: Synchronizácia titulkov...")
# Fasádny vzor
class VideoConverterFacade:
def __init__(self):
self._audio_mixer = AudioMixer()
self._video_renderer = VideoRenderer()
self._subtitle_manager = SubtitleManager()
def convert_video(self, filename):
print("\nVideoConverterFacade: Spustenie konverzie videa...")
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): # Simulácia spracovania snímok
self._video_renderer.render(i)
self._audio_mixer.set_volume(5)
print("VideoConverterFacade: Konverzia videa dokončená.\n")
# Klientska časť
# Bez Fasády by klient musel priamo komunikovať
# so všetkými triedami podsystému.
# mixer = AudioMixer()
# renderer = VideoRenderer()
# subtitles = SubtitleManager()
# ... veľa riadkov kódu na komunikáciu ...
# S Fasádou komunikuje klient iba s Fasádou
facade = VideoConverterFacade()
facade.convert_video("my_movie")
Kedy použiť:
- Keď je potrebné poskytnúť jednoduché rozhranie ku komplexnému podsystému.
- Keď existuje veľa závislostí medzi klientmi a triedami podsystému.
- Na rozdelenie podsystému na vrstvy.
Výhody:
- Zjednodušuje komunikáciu s podsystémom.
- Znižuje závislosť medzi klientom a podsystémom.
- Uľahčuje zmenu alebo výmenu podsystému.
Nevýhody:
- Fasáda sa môže stať "božským objektom", ak obsahuje príliš veľa funkcií.
- Môže skrývať dôležité detaily, ktoré môžu byť potrebné pokročilým používateľom podsystému.
Všeobecne je Fasáda pohodlný spôsob organizácie kódu a zlepšenia čitateľnosti a použiteľnosti zložitých systémov.