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
作为类型,并调用模板方法。这将导致子类根据其实现执行相应的步骤。