โ Kembali ke Design Pattern
๐๏ธ
Structural
Facade
Menyediakan interface sederhana untuk subsistem yang kompleks, sambil menyembunyikan detail di dalamnya.
Masalahnya
Library atau kumpulan service yang kompleks punya banyak class, konfigurasi, dan titik masuk. Kode client jadi kusut karena harus mengelola semuanya secara langsung.
Cara Kerja
- โบMengurangi keterikatan antara client dan subsistem yang kompleks
- โบTidak mengunci subsistem; pengguna tingkat lanjut tetap bisa melewati facade bila perlu
- โบSatu titik masuk membuat subsistem lebih mudah dipakai dengan benar
- โบMempermudah testing karena cukup me-mock facade, bukan setiap class di subsistem
- โบUmum dipakai untuk membungkus SDK pihak ketiga agar paparannya ke aplikasi terbatas
Kapan Digunakan
โMenyederhanakan library atau kumpulan service yang kompleks di balik satu interface yang rapi
โMembuat lapisan antar subsistem untuk mengurangi ketergantungan di antaranya
โMenyediakan default yang masuk akal untuk kasus umum
โMembungkus SDK pihak ketiga agar aplikasimu tidak terlalu terikat padanya
Contoh di Dunia Nyata
๐
iOS
Alamofire (facade over URLSession stack), AVPlayer wrapper classes
๐ค
Android
Glide/Picasso (facade over Bitmap/network ops), Retrofit
๐
Web
jQuery (facade over DOM APIs), axios (facade over XMLHttpRequest/fetch)
Contoh Kode
Swift
// Complex subsystems
class AuthService {
func login(user: String, pass: String) -> String { "token_abc" }
}
class ProfileService {
func fetch(token: String) -> [String: String] { ["name": "Agus"] }
}
class CacheService {
func store(_ key: String, _ value: Any) { }
}
// Facade: one entry point for the whole auth + profile flow
class AppFacade {
private let auth = AuthService()
private let profile = ProfileService()
private let cache = CacheService()
func signIn(username: String, password: String) -> [String: String] {
let token = auth.login(user: username, pass: password)
let data = profile.fetch(token: token)
cache.store("profile", data)
return data
}
}
// Client only deals with one object
let app = AppFacade()
print(app.signIn(username: "agus", password: "secret"))
// ["name": "Agus"]