Middle
Šta je obrazac fasade (Facade)?
sobes.tech АИ
Одговор од АИ
Шаблон "Фасада" је структурни образац дизајна који пружа поједностављени интерфејс за сложени систем класа, библиотеку или подсистем. Он скрива детаље имплементације подсистема и пружа једну тачку уласка за извршавање типичних операција.
Циљ:
- Побрзати коришћење сложеног система.
- Смањити зависности између клијента и подсистема.
- Учинити подсистем флексибилнијим према променама.
Структура:
- Фасада (Facade): Пружа једноставан интерфејс за клијента. Делегира захтеве одговарајућим објектима подсистема.
- Класе подсистема (SubSystem Classes): Реализују функционалност подсистема. Нису упознати са Фасадом.
Пример у Python-у:
# Класе сложеног подсистема
class AudioMixer:
def __init__(self):
print("AudioMixer: Иницијализација...")
def configure(self, type):
print(f"AudioMixer: Конфигурисање за {type}...")
def set_volume(self, level):
print(f"AudioMixer: Подешавање јачине звука на {level}...")
class VideoRenderer:
def __init__(self):
print("VideoRenderer: Иницијализација...")
def set_resolution(self, res):
print(f"VideoRenderer: Подешавање резолуције на {res}...")
def render(self, frame):
print(f"VideoRenderer: Рендеровање кадра {frame}...")
class SubtitleManager:
def __init__(self):
print("SubtitleManager: Иницијализација...")
def load(self, file):
print(f"SubtitleManager: Учитавање титлова из {file}...")
def sync(self):
print("SubtitleManager: Синхронизација титлова...")
# Фасада образац
class VideoConverterFacade:
def __init__(self):
self._audio_mixer = AudioMixer()
self._video_renderer = VideoRenderer()
self._subtitle_manager = SubtitleManager()
def convert_video(self, filename):
print("\nVideoConverterFacade: Почетак конверзије видеа...")
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): # Имитација обраде кадрова
self._video_renderer.render(i)
self._audio_mixer.set_volume(5)
print("VideoConverterFacade: Конверзија видеа завршена.\n")
# Клијентски код
# Без Фасаде, клијент би морао директно да комуницира
# са свим класама подсистема.
# mixer = AudioMixer()
# renderer = VideoRenderer()
# subtitles = SubtitleManager()
# ... много редова кода за комуникацију ...
# Са Фасадом, клијент комуницира само са Фасадом
facade = VideoConverterFacade()
facade.convert_video("my_movie")
Када користити:
- Када је потребно пружити једноставан интерфејс за сложени подсистем.
- Када постоји много зависности између клијената и класа подсистема.
- За раздвајање подсистема на слојеве.
Предности:
- Олакшава комуникацију са подсистемом.
- Смањује зависност између клијента и подсистема.
- Олакшава промену или замену подсистема.
Недостаци:
- Фасада може постати "богов објекат" ако укључује превише функционалности.
- Може скривати важне детаље који могу бити потребни напредним корисницима подсистема.
Уопштено, Фасада је згодан начин организовања кода и побољшања читљивости и употребљивости сложеног система.