在Kotlin中,模板方法模式可以通過在抽象類中定義一個算法的骨架,并將一些步驟的實現延遲到子類來完成
abstract class AbstractTemplate {
// 模板方法
fun templateMethod() {
step1()
step2()
step3()
}
// 抽象方法,子類必須實現
abstract fun step1()
// 抽象方法,子類必須實現
abstract fun step2()
// 具體方法,子類可以覆蓋
fun step3() {
println("Step 3 implemented in AbstractTemplate")
}
}
class ConcreteTemplateA : AbstractTemplate() {
override fun step1() {
println("Step 1 implemented in ConcreteTemplateA")
}
override fun step2() {
println("Step 2 implemented in ConcreteTemplateA")
}
}
class ConcreteTemplateB : AbstractTemplate() {
override fun step1() {
println("Step 1 implemented in ConcreteTemplateB")
}
override fun step2() {
println("Step 2 implemented in ConcreteTemplateB")
}
// 可以覆蓋具體方法以改變行為
override fun step3() {
println("Step 3 implemented in ConcreteTemplateB")
}
}
fun main() {
val templateA = ConcreteTemplateA()
templateA.templateMethod()
val templateB = ConcreteTemplateB()
templateB.templateMethod()
}
輸出:
Step 1 implemented in ConcreteTemplateA
Step 2 implemented in ConcreteTemplateA
Step 3 implemented in AbstractTemplate
Step 1 implemented in ConcreteTemplateB
Step 2 implemented in ConcreteTemplateB
Step 3 implemented in ConcreteTemplateB
在這個例子中,AbstractTemplate
類定義了一個模板方法 templateMethod()
,它包含了算法的骨架。step1()
和 step2()
是抽象方法,子類必須實現它們。step3()
是一個具體方法,子類可以選擇覆蓋它以改變行為。客戶端代碼使用抽象類 AbstractTemplate
作為類型,并調用模板方法。這將導致子類根據其實現執行相應的步驟。