Ar pažįstate Facade dizaino šabloną? Papasakokite apie savo patirtį jį naudojant.
sobes.tech AI
Atsakymas iš AI
Taip, aš pažįstu dizaino šabloną Facade. Tai struktūrinis šablonas, kuris suteikia vieningą sąsają sudėtingai klasės subsistemai. Jo tikslas yra supaprastinti subsistemos naudojimą, paslėpiant jos sudėtingumą nuo kliento.
Turiu patirties su Facade šablonu, pavyzdžiui, dirbant su daugiapakopės architektūros programomis. Pavyzdžiui, turėjome modulį, skirtą tinklo ir duomenų bazės operacijoms. Vietoj to, kad klientų kodas tiesiogiai sąveikautų su tinklo sluoksnio klasėmis (Retrofit, OkHttp), parseriais, duomenų bazės klasėmis (Room, DAO), buvo sukurta fasadų klasė. Ši fasadų klasė teikė paprastus metodus, pvz., getUser(userId) arba saveUser(user), kurie viduje koordinavo sąveiką su atitinkamomis subsistemomis: atlikdavo tinklo užklausą, parsiųsdavo duomenis, saugodavo juos duomenų bazėje.
Šio požiūrio privalumai:
- Supaprastina kliento kodą: Klientas neturi žinoti apie subsistemos vidinę struktūrą.
- Sumažina priklausomybę: Fasadas atskiria klientą nuo konkrečių subsistemos įgyvendinimų, tai palengvina jų keitimą.
- Pagerina struktūriškumą: Subsistema tampa valdomesnė ir suprantamesnė.
Pavyzdys supaprastintos fasado įgyvendinimo:
// API sąsaja
class ApiService {
fun getUserFromApi(userId: Int): String {
// Tinklo užklausos logika
return "{\"id\":$userId, \"name\":\"John Doe\"}"
}
}
// Duomenų bazės sąsaja
class DatabaseService {
fun saveUserToDb(userJson: String) {
// Duomenų saugojimo logika
}
fun getUserFromDb(userId: Int): String {
// Duomenų gavimo logika
return "" // Pakeitimas
}
}
// Fasadas
class UserFacade(
private val apiService: ApiService,
private val databaseService: DatabaseService
) {
fun getUser(userId: Int): String {
// Pirmiausia bandome gauti iš duomenų bazės
val userFromDb = databaseService.getUserFromDb(userId)
if (userFromDb.isNotEmpty()) {
return userFromDb
}
// Jei nėra duomenų bazėje, gauname iš API
val userFromApi = apiService.getUserFromApi(userId)
// Saugojame į duomenų bazę cache'ui
databaseService.saveUserToDb(userFromApi)
return userFromApi
}
}
// Pavyzdys, kaip naudoti fasadą kliento kode
fun main() {
val apiService = ApiService()
val databaseService = DatabaseService()
val userFacade = UserFacade(apiService, databaseService)
val userJson = userFacade.getUser(123)
println(userJson)
}
Šiame pavyzdyje UserFacade paslepia naudotojo duomenų gavimo iš API ir saugojimo duomenų bazėje detales, teikdama kliento kodui paprastą getUser metodą. Klientas nereikia žinoti apie ApiService ir DatabaseService egzistavimą.
Taip Facade padeda kurti švaresnį, suprantamesnį ir lengvai prižiūrimą kodą, ypač dirbant su sudėtingais moduliais.