0Pricing
Kotlin Academy · Pelajaran

Pola Praktis

Dekorator dengan delegasi

Pola Praktis adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Pola Dekorator

Dekorator membungkus objek untuk menambahkan perilaku sambil mempertahankan antarmuka yang sama. Kata kunci Kotlin by membuat dekorator menjadi sederhana: teruskan semuanya, lalu ganti bagian yang ingin Anda tingkatkan.

Komponen Dasar

Kita mulai dengan sumber data sederhana. Dekorator akan membungkus sumber data ini.

interface DataSource {
    fun fetch(): String
}

class NetworkSource : DataSource {
    override fun fetch() = "raw-data"
}

fun main() {
    println(NetworkSource().fetch())
}

Dekorator Pencatatan

Dekorator meneruskan pekerjaan ke sumber yang dibungkusnya dan menambahkan pencatatan di sekitar call yang ditanganinya.

interface DataSource { fun fetch(): String }
class NetworkSource : DataSource { override fun fetch() = "raw-data" }

class LoggingSource(private val inner: DataSource) : DataSource by inner {
    override fun fetch(): String {
        println("fetching...")
        val result = inner.fetch()
        println("done")
        return result
    }
}

fun main() {
    println(LoggingSource(NetworkSource()).fetch())
}

Dekorator Penyimpanan Sementara

Dekorator lain menyimpan hasil pertama untuk sementara, sehingga calls berikutnya tidak perlu mengakses sumber di baliknya.

interface DataSource { fun fetch(): String }
class NetworkSource : DataSource { override fun fetch() = "raw-data" }

class CachingSource(private val inner: DataSource) : DataSource by inner {
    private var cached: String? = null
    override fun fetch(): String {
        return cached ?: inner.fetch().also { cached = it }
    }
}

fun main() {
    val s = CachingSource(NetworkSource())
    println(s.fetch())
    println(s.fetch()) // served from cache
}

Menyusun Dekorator

Karena setiap dekorator juga merupakan DataSource, Anda dapat menyusunnya secara bertingkat. Urutannya penting: pembungkus luar membungkus pembungkus dalam.

interface DataSource { fun fetch(): String }
class NetworkSource : DataSource { override fun fetch() = "raw-data" }

class LoggingSource(private val inner: DataSource) : DataSource by inner {
    override fun fetch(): String { println("log"); return inner.fetch() }
}
class CachingSource(private val inner: DataSource) : DataSource by inner {
    private var c: String? = null
    override fun fetch() = c ?: inner.fetch().also { c = it }
}

fun main() {
    val s = LoggingSource(CachingSource(NetworkSource()))
    println(s.fetch())
    println(s.fetch())
}

Dekorator Validasi

Dekorator juga dapat memeriksa masukan. Di sini, sebuah dekorator melakukan validasi sebelum meneruskan pekerjaan ke pekerja sebenarnya.

interface Processor { fun process(input: String): String }
class UpperProcessor : Processor { override fun process(input: String) = input.uppercase() }

class ValidatingProcessor(private val inner: Processor) : Processor by inner {
    override fun process(input: String): String {
        require(input.isNotBlank()) { "empty input" }
        return inner.process(input)
    }
}

fun main() {
    println(ValidatingProcessor(UpperProcessor()).process("hello"))
}

Pembungkus Koleksi Hanya Baca

Delegasi memudahkan pembuatan pembungkus adaptor. Di sini, kita membungkus sebuah daftar dan menambahkan metode ringkasan khusus sambil meneruskan semua operasi daftar.

class SummarizedList(private val inner: List<Int>) : List<Int> by inner {
    fun total() = inner.sum()
}

fun main() {
    val list = SummarizedList(listOf(1, 2, 3))
    println(list.size)
    println(list.total())
}

Menghitung calls

Dekorator dapat melacak metrik secara transparan, sehingga berguna untuk pemantauan tanpa menyentuh implementasi sebenarnya.

interface Service { fun call(): String }
class RealService : Service { override fun call() = "ok" }

class CountingService(private val inner: Service) : Service by inner {
    var calls = 0
        private set
    override fun call(): String {
        calls++
        return inner.call()
    }
}

fun main() {
    val s = CountingService(RealService())
    s.call(); s.call()
    println(s.calls)
}

Mengapa Delegasi Unggul di Sini

Membangun dekorator melalui pewarisan akan memaksa kelas dasar menjadi open dan mengikat setiap dekorator pada kelas konkret. Delegasi hanya bergantung pada antarmuka, sehingga dekorator tetap memiliki keterikatan longgar dan dapat disusun.

Daftar Periksa Pola

Untuk membuat dekorator delegasi:

  • Terima objek yang dibungkus sebagai private val
  • Delegasikan antarmuka dengan by
  • Ganti hanya anggota yang Anda tingkatkan
  • Panggil objek dalam dari dalam penggantian tersebut

Menggabungkan Semuanya

Dekorator, adaptor, dan proksi muncul secara alami dari delegasi kelas. Jika dipadukan dengan antarmuka kecil, semuanya memungkinkan Anda membangun sistem fleksibel berlapis yang mudah diuji dan diperluas.

Pemeriksaan Singkat

Uji pemahaman Anda tentang pola delegasi praktis.

Ringkasan

Anda telah membuat dekorator praktis dengan delegasi:

  • Pembungkus untuk pencatatan, penyimpanan sementara, validasi, dan penghitungan
  • Menyusun dekorator karena setiap dekorator menggunakan antarmuka yang sama
  • Mengganti hanya anggota yang ditingkatkan; teruskan anggota lainnya

Dengan ini, kursus delegasi kelas selesai.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola Praktis” gratis?

Ya — teks lengkap “Pola Praktis” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pola Praktis”?

Dekorator dengan delegasi Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Pola Praktis” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Kata Kunci by
  2. Mendelegasikan kepada Anggota
  3. Delegasi versus Pewarisan
  4. Pola Praktis
← Kembali ke Kotlin Academy