รูปแบบเชิงปฏิบัติ
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คีย์เวิร์ด by
- การมอบหมายให้สมาชิก
- การมอบหมายเทียบกับการสืบทอด
- รูปแบบเชิงปฏิบัติ