Да ли сте упознати са шаблоном дизајна Facade? Испричајте о вашем искуству са његовим коришћењем.
sobes.tech АИ
Одговор од АИ
Da, upoznat sam sa obrazcem za dizajn Facade. To je strukturni obrazac koji pruža ujednačeni interfejs ka složenom podsistemu klasa. Cilj mu je pojednostaviti korišćenje podsistema skrivajući njegovu složenost od klijenta.
Iskustvo sa korišćenjem obrasca Facade imam, na primer, prilikom rada sa višeslojnom arhitekturom aplikacije. Zamislimo modul za rad sa mrežom i bazom podataka. Umesto da klijentski kod direktno komunicira sa klasama mrežnog sloja (Retrofit, OkHttp), parserima, klasama baze podataka (Room, DAO), implementirana je fasadna klasa. Ova fasada pruža jednostavne metode, na primer getUser(userId) ili saveUser(user), koje interno koordiniraju interakciju sa odgovarajućim podsistemima: vrše mrežni zahtev, parsiraju podatke, čuvaju ih u bazi.
Prednosti takvog pristupa:
- Pojednostavljenje klijentskog koda: Klijent ne mora da zna o unutrašnjoj strukturi podsistema.
- Smanjenje povezanosti: Fasada odvaja klijenta od konkretnih implementacija podsistema, što olakšava njihovu zamenu.
- Poboljšanje strukturalnosti: Podsistem postaje bolje upravljiv i razumljiv.
Primer pojednostavljene implementacije fasade:
// Podsistem za rad sa API-jem
class ApiService {
fun getUserFromApi(userId: Int): String {
// Logika mrežnog zahteva
return "{\"id\":$userId, \"name\":\"John Doe\"}"
}
}
// Podsistem za rad sa bazom
class DatabaseService {
fun saveUserToDb(userJson: String) {
// Logika čuvanja u bazu
}
fun getUserFromDb(userId: Int): String {
// Logika dobijanja iz baze
return "" // Zastava
}
}
// Fasada
class UserFacade(
private val apiService: ApiService,
private val databaseService: DatabaseService
) {
fun getUser(userId: Int): String {
// Prvo pokušavamo da dobijemo iz baze
val userFromDb = databaseService.getUserFromDb(userId)
if (userFromDb.isNotEmpty()) {
return userFromDb
}
// Ako nema u bazi, dobijamo iz API-ja
val userFromApi = apiService.getUserFromApi(userId)
// Čuvamo u bazi za keširanje
databaseService.saveUserToDb(userFromApi)
return userFromApi
}
}
// Primer korišćenja fasade u klijentskom kodu
fun main() {
val apiService = ApiService()
val databaseService = DatabaseService()
val userFacade = UserFacade(apiService, databaseService)
val userJson = userFacade.getUser(123)
println(userJson)
}
U ovom primeru UserFacade skriva detalje dobijanja podataka o korisniku iz API-ja i čuvanja u bazi, pružajući klijentskom kodu jednostavnu metodu getUser. Klijent ne mora da zna za postojanje ApiService i DatabaseService.
Na ovaj način, Facade pomaže u kreiranju čistijeg, razumljivijeg i lako održivog koda, posebno pri radu sa složenim modulima.