' ============================================================ ' WALKGUIDE — DESIGN PATTERNS (GoF) ' Flutter × Spring Boot × In-Device AI ' Pattern 3 of 7: FACADE (Structural) ' ============================================================ @startuml WalkGuide_03_Facade skinparam monochrome false skinparam shadowing false skinparam defaultFontName Arial skinparam defaultFontSize 12 skinparam roundCorner 10 skinparam ArrowColor #555555 skinparam ArrowThickness 1.2 skinparam class { BackgroundColor #FAFAFA BorderColor #AAAAAA HeaderBackgroundColor #E8E8E8 FontColor #222222 StereotypeFontColor #666666 AttributeFontColor #333333 } skinparam package { BackgroundColor #F5F5F5 BorderColor #888888 FontColor #333333 FontStyle bold } skinparam note { BackgroundColor #FFFDE7 BorderColor #F9A825 FontColor #444444 FontSize 11 } ' ============================================================ ' PATTERN 3 — FACADE (Structural) — Flutter ' ============================================================ package "③ Facade Pattern [Structural]" #FFF8E1 { class "VoiceCommandHandler\n<>" as VoiceCommandHandler { - _ttsService : TtsService - _sttService : SttService - _router : GoRouter - _walkGuideBloc : WalkGuideBloc - _sosBloc : SosBloc - _notifBloc : NotificationBloc + processText(String command) : void - _matchCommand(String) : VoiceCommandKey? - _executeCommand(VoiceCommandKey) : void } class "WalkGuideBloc\n<>" as WalkGuideBlocFacade { + onVoiceCommand(String text) } class "GuardianDashboardService\n<>" as GuardianDashboardService { - _locationService : LocationService - _activityService : ActivityLogService - _sosService : SosService - _notifService : NotificationService + getDashboard(guardianId) : DashboardResponse } class "SttService " as SttServiceFacade <> class "TtsService " as TtsServiceFacade <> class "GoRouter\n<>" as GoRouterFacade <> class "SosBloc " as SosBlocFacade <> class "LocationService\n<>" as LocationService <> class "ActivityLogService\n<>" as ActivityService <> class "SosService\n<>" as SosServiceFacade <> WalkGuideBlocFacade --> VoiceCommandHandler : processText() VoiceCommandHandler --> SttServiceFacade : delegates VoiceCommandHandler --> TtsServiceFacade : delegates VoiceCommandHandler --> GoRouterFacade : delegates VoiceCommandHandler --> SosBlocFacade : delegates GuardianDashboardService --> LocationService : aggregates GuardianDashboardService --> ActivityService : aggregates GuardianDashboardService --> SosServiceFacade : aggregates } note right of VoiceCommandHandler Client hanya panggil processText("start walkguide") tanpa perlu tahu kompleksitas di baliknya: matching phrase → execute command → TTS feedback → route navigation → BLoC event dispatch end note @enduml