0Pricing
Kotlin Academy · บทเรียน

รูปแบบเชิงปฏิบัติ

Decorator ด้วยการมอบหมาย

รูปแบบเชิงปฏิบัติ เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

รูปแบบตัวตกแต่ง

ตัวตกแต่งจะห่อหุ้มออบเจ็กต์เพื่อเพิ่มพฤติกรรม โดยยังคงใช้ส่วนติดต่อเดิม ภาษา Kotlin ทำให้การสร้างตัวตกแต่งเป็นเรื่องง่ายด้วยคีย์เวิร์ด by: ส่งต่อทุกอย่าง แล้วเขียนทับเฉพาะส่วนที่คุณต้องการเพิ่มความสามารถ

องค์ประกอบพื้นฐาน

เราเริ่มต้นด้วยแหล่งข้อมูลอย่างง่าย ตัวตกแต่งจะห่อหุ้มแหล่งข้อมูลนี้

interface DataSource {
    fun fetch(): String
}

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

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

ตัวตกแต่งสำหรับการบันทึกข้อมูล

ตัวตกแต่งจะมอบหมายงานให้แหล่งข้อมูลที่ถูกห่อหุ้ม และเพิ่มการบันทึกข้อมูลรอบการเรียกใช้ที่ต้องการดูแล

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())
}

ตัวตกแต่งสำหรับการเก็บแคช

ตัวตกแต่งอีกตัวหนึ่งจะเก็บผลลัพธ์แรกไว้ในแคช เพื่อให้การเรียกใช้ซ้ำข้ามการทำงานของแหล่งข้อมูลพื้นฐาน

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
}

การซ้อนตัวตกแต่ง

เนื่องจากตัวตกแต่งแต่ละตัวเป็น DataSource ได้ด้วยตัวเอง คุณจึงสามารถซ้อนตัวตกแต่งหลายชั้นได้ ลำดับมีความสำคัญ: ตัวด้านนอกจะห่อหุ้มตัวด้านใน

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())
}

ตัวตกแต่งสำหรับตรวจสอบความถูกต้อง

ตัวตกแต่งยังสามารถตรวจสอบอินพุตได้ด้วย ในที่นี้ตัวตกแต่งจะตรวจสอบความถูกต้องก่อนมอบหมายงานให้ตัวทำงานจริง

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"))
}

ตัวห่อหุ้มคอลเลกชันแบบอ่านอย่างเดียว

การมอบหมายทำให้การสร้างตัวห่อหุ้มเพื่อปรับรูปแบบเป็นเรื่องง่าย ในที่นี้เราห่อหุ้มรายการและเพิ่มเมธอดสรุปแบบกำหนดเอง พร้อมส่งต่อการดำเนินการกับรายการทั้งหมด

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())
}

การนับการเรียกใช้

ตัวตกแต่งสามารถติดตามตัวชี้วัดได้โดยไม่เปิดเผยการทำงาน เหมาะสำหรับการตรวจติดตามโดยไม่ต้องแก้ไขการนำไปใช้จริง

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)
}

เหตุผลที่การมอบหมายเหมาะกับกรณีนี้

การสร้างตัวตกแต่งด้วยการสืบทอดจะบังคับให้คลาสฐานต้องเป็น open และทำให้ตัวตกแต่งแต่ละตัวผูกติดกับคลาสรูปธรรม การมอบหมายพึ่งพาเพียงส่วนติดต่อ ตัวตกแต่งจึงมีการเชื่อมโยงหลวมและนำมาประกอบกันได้

รายการตรวจสอบรูปแบบ

หากต้องการสร้างตัวตกแต่งด้วยการมอบหมาย:

  • รับออบเจ็กต์ที่ห่อหุ้มไว้เป็น private val
  • มอบหมายส่วนติดต่อด้วย by
  • เขียนทับเฉพาะสมาชิกที่คุณเพิ่มความสามารถ
  • เรียกใช้ออบเจ็กต์ด้านในภายในการเขียนทับ

การนำทุกอย่างมารวมกัน

ตัวตกแต่ง ตัวปรับรูปแบบ และพร็อกซี ล้วนเกิดขึ้นได้อย่างเป็นธรรมชาติจากการมอบหมายระดับคลาส เมื่อใช้ร่วมกับส่วนติดต่อขนาดเล็ก สิ่งเหล่านี้ช่วยให้คุณสร้างระบบแบบหลายชั้นที่ยืดหยุ่น ทดสอบได้ง่าย และขยายต่อได้

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับรูปแบบการมอบหมายในทางปฏิบัติ

สรุปทบทวน

คุณได้สร้างตัวตกแต่งในทางปฏิบัติด้วยการมอบหมาย:

  • ตัวห่อหุ้มสำหรับการบันทึกข้อมูล การเก็บแคช การตรวจสอบความถูกต้อง และการนับ
  • การซ้อนตัวตกแต่ง เนื่องจากแต่ละตัวใช้ส่วนติดต่อเดียวกัน
  • เขียนทับเฉพาะสมาชิกที่เพิ่มความสามารถ และส่งต่อส่วนที่เหลือ

บทเรียนการมอบหมายระดับคลาสจบลงเพียงเท่านี้

คำถามที่พบบ่อย

บทเรียน “รูปแบบเชิงปฏิบัติ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบเชิงปฏิบัติ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบเชิงปฏิบัติ”

Decorator ด้วยการมอบหมาย คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบเชิงปฏิบัติ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คีย์เวิร์ด by
  2. การมอบหมายให้สมาชิก
  3. การมอบหมายเทียบกับการสืบทอด
  4. รูปแบบเชิงปฏิบัติ
← กลับไปที่ Kotlin Academy