โ† 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"]