委托是常见的模式,它和编程语言无关,即把本来自己做的事情委托给另一个对象去做。装饰者模式和代理模式都通过委托复用了行为。Kotlin 在语言层面支持了委托,这一篇结合实例介绍一下 Kotlin 的委托。
Kotlin 的装饰者模式
装饰者模式和继承拥有相同的目的,都是为了扩展类,只不过它运用了更复杂的方式通:继承 + 组合。装饰者模式在复用原有类型和行为的基础上为其扩展功能。
下面是装饰者模式的实例:
interface Accessory {
fun name(): String // 配件名字
fun cost(): Int // 配件价格
fun type(): String // 配件类别
}
这个接口用来描述一个抽象的配件,一个具体的配件需要实现三个方法,分别来定义配件名字、价格、类别。
羽毛、戒指、耳环是3个具体的配件,它的实现如下:
class Feather: Accessory{
override fun name(): String = "Feather"
override fun cost(): Int = 20
override fun type(): String = "body accessory"
}
class Ring: Accessory{
override fun name(): String = "Ring"
override fun cost(): Int = 30
override fun type(): String = "body accessory"
}
class Earrings: Accessory{
override fun name(): String = "Earrings"
override fun cost(): Int = 15
override fun type(): String = "body accessory"
}
现需要新增羽毛戒指和羽毛耳环,按照继承的思想可以这样实现:
class FeatherRing: Accessory{
override fun name(): String = "FeatherRing"
override fun cost(): Int = 35
override fun type(): String = "body accessory"
}
class FeatherEarrings: Accessory{
override fun name(): String = "FeatherEarrings"
override fun cost(): Int = 45
override fun type(): String = "body accessory"
}
这样写的缺点是只复用了类型,没复用行为。每次新增类型的时候都得新增一个子类,会造成子类膨胀。若改用装饰者模式,则可以减少一个子类:
class Feather(private var accessory: Accessory) : Accessory {
override fun