# WalkGuide Design Pattern Documentation

## Builder - Creational
- Backend DTO/entity builders via Lombok `@Builder`.
- Files: `PairingStatusResponse.java`, `AgoraTokenResponse.java`, entity classes such as `PairingRelation.java`.
- Reason: response/entity construction has many optional fields, so builder calls are clearer than long constructors.

## Singleton / Service Locator - Creational
- Flutter registers app-wide services once with GetIt.
- File: `walkguide-mobile/walkguide_app/lib/app/injection_container.dart`.
- Examples: `TtsService`, `WebSocketService`, `CallService`, `YoloDetector`.
- Reason: resource-heavy services need one shared lifecycle.

## Facade - Structural
- Flutter service classes hide low-level plugins from UI.
- Files: `TtsService`, `HapticService`, `FcmService`, `CallService`, `WebSocketService`.
- Reason: screens call simple domain-oriented methods instead of plugin APIs directly.

## Repository - Structural
- Backend repositories abstract JPA persistence.
- Files: `UserRepository`, `PairingRelationRepository`, `LocationHistoryRepository`, etc.
- Reason: service layer works against repository contracts, not SQL.

## Observer - Behavioral
- Flutter BLoC/Cubit and ChangeNotifier notify screens on state changes.
- Backend WebSocket broker pushes location/SOS/notification updates to subscribers.
- Files: `AppCubit`, `WebSocketService`, `LocationBroadcaster`.
- Reason: real-time features need push updates without polling.

## Strategy - Behavioral
- Obstacle direction/distance analysis can vary independently from camera capture.
- File: `core/ai/obstacle_analyzer.dart`.
- Reason: detection interpretation is isolated so thresholds/rules can evolve.

## Chain of Responsibility - Behavioral
- Dio interceptors handle token injection, refresh, and error flow.
- File: `core/network/api_client.dart`.
- Reason: each request passes through consistent auth/error handling before reaching UI.
