Sobes.tech
Middle

Kas yra fasado modelis (Facade)?

sobes.tech AI

Atsakymas iš AI

Fasado šablonas yra struktūrinis dizaino šablonas, kuris suteikia supaprastintą sąsają sudėtingai klasių, bibliotekos ar sub-sistemos sistemai. Jis slepia sub-sistemos įgyvendinimo detales ir suteikia vieną įėjimo tašką tipinėms operacijoms vykdyti.

Tikslas:

  • Supaprastinti sudėtingos sistemos naudojimą.
  • Sumažinti priklausomybes tarp kliento ir sub-sistemos.
  • Padaryti sub-sistemą lankstesnę pokyčiams.

Struktūra:

  • Fasadas (Facade): Suteikia paprastą sąsają klientui. Paskirsto užklausas atitinkamiems sub-sistemos objektiems.
  • Sub-sistemos klasės (SubSystem Classes): Įgyvendina sub-sistemos funkcionalumą. Nesusipažįsta su Fasadu.

Pavyzdys Python:

# Sudėtingos sub-sistemos klasės
class AudioMixer:
    def __init__(self):
        print("AudioMixer: Inicijuojama...")

    def configure(self, type):
        print(f"AudioMixer: Konfigūruojama {type}...")

    def set_volume(self, level):
        print(f"AudioMixer: Nustatomas garsumo lygis {level}...")

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

    def set_resolution(self, res):
        print(f"VideoRenderer: Nustatomas raiška {res}...")

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

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

    def load(self, file):
        print(f"SubtitleManager: Įkeliami subtitrai iš {file}...")

    def sync(self):
        print("SubtitleManager: Subtitrų sinchronizavimas...")

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

    def convert_video(self, filename):
        print("\nVideoConverterFacade: Pradedama vaizdo konvertavimas...")
        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): # Kadro apdorojimo imitacija
            self._video_renderer.render(i)
        self._audio_mixer.set_volume(5)
        print("VideoConverterFacade: Vaizdo konvertavimas baigtas.\n")

# Kliento kodas
# Be Fasado klientas turėtų tiesiogiai bendrauti
# su visomis sub-sistemos klasėmis.
# mixer = AudioMixer()
# renderer = VideoRenderer()
# subtitles = SubtitleManager()
# ... daug kodo sąveikai ...

# Su Fasadu klientas bendrauja tik su Fasadu
facade = VideoConverterFacade()
facade.convert_video("my_movie")

Kada naudoti:

  • Kai reikia pateikti paprastą sąsają sudėtingai sub-sistemai.
  • Kai yra daug priklausomybių tarp klientų ir sub-sistemos klasių.
  • Norint padalinti sub-sistemą į sluoksnius.

Privalumai:

  • Supaprastina sąveiką su sub-sistema.
  • Sumažina priklausomybę tarp kliento ir sub-sistemos.
  • Palengvina pakeitimą ar keitimą sub-sistemos.

Trūkumai:

  • Fasadas gali tapti "Dievo objektu", jei jis apima per daug funkcionalumo.
  • Gali paslėpti svarbias detales, kurios gali būti reikalingos pažengusiems naudotojams.

Bendrai, Fasadas yra patogus būdas organizuoti kodą ir pagerinti sudėtingos sistemos skaitomumą bei naudojimo patogumą.