访问者设计模式,是GoF阐述的23中常见设计模式中,行为型设计模式的一种。
访问者设计模式,表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变个元素类的前提下定义作用于这些元素的新操作。使用该设计模式可以让我们能够访问到各个元素,于是我们可以将相关方法的实现放在类的外部,这样就可以使得类不再臃肿。下面是具体的代码实现:
package com.agg.kotlinapplication
sealed class Target {
abstract fun accept(v: Visitor): Boolean
class Num(val value: Int) : Target() {
override fun accept(v: Visitor): Boolean = v.visit(this)
}
class Operate(val name: String, val left: Target, val right: Target) : Target() {
override fun accept(v: Visitor): Boolean = v.visit(this)
}
}
class Visitor {
fun visit(target: Target.Num): Boolean = false
fun visit(target: Target.Operate): Boolean = when (target) {
Target.Operate("+", Target.Num(0), target.right) -> true
Target.Operate("+", target.left, Target.Num(0)) -> true
else -> false
}
}
密封类Tatget及其子类Num、Operate中,定义了accept方法,用来给访问者类Visitor提供访问的通道。
访问者类Visitor中,实现了两个visit方法,它们的参数类型不同,这是为了对特定的子类进行不同的操作,也是访问者模式比较关键的一点。
访问者模式的优缺点:
优点:可以将类中的方法的实现放在了外部,这样可以让类的结构看上去比较单纯。
缺点:当频繁的增加子类型,访问者类就需要不断的修改。比如,给Target新增一个子类,那么就需要在访问者中再为这个子类增加一个visit操作。
参考:【Kotlin核心编程-水滴技术团队】