阅读 247

委托模式kotlin实战 | 创作者训练营第二期

委托模式kotlin实战

什么是委托模式

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。---- kotlin委托|菜鸟教程

场景实战

设想这样一个场景,你要参加一场同学会,希望在同学会上装杯,于是你想借朋友的车开。

你有两个朋友分别是开奥迪朋友A和开宝马朋友B,你可以选择找他们借车。

委托模式.jpg

首先定义了汽车接口ICar,包含两个方法:启动start()和刹车brake()

interface ICar{
    // 启动
    fun start()

    // 刹车
    fun brake()
}
复制代码

ICar有两个实现类分别为AUDIBMW

// 奥迪
class AUDI:ICar {

    // 奥迪启动了
    override fun start() {
        println("AUDI start now")
    }

    // 奥迪刹车了
    override fun brake() {
        println("AUDI brake now")
    }
}

// 宝马
class BMW:ICar {

    // 宝马启动了
    override fun start() {
        println("BMW start now")
    }

    // 宝马刹车了
    override fun brake() {
        println("BMW brake now")
    }
}
复制代码

然后定义朋友接口IFriend包含借车方法getCar()

interface IFriend {

    // 从朋友处借车
    fun getCar():ICar
}
复制代码

IFriend有两个实现类分别为朋友AFriendA和朋友BFriendB

// 朋友A 有一辆奥迪
class FriendA():IFriend{
    private val car = AUDI()
    override fun getCar(): ICar {
        return car
    }
}

// 朋友B 有一辆宝马
class FriendB():IFriend{
    private val car = BMW()
    override fun getCar(): ICar {
        return car
    }
}
复制代码

你自己没有车,但是想开车去同学会,所以你需要借朋友的:

// 我自己没有车,得从外边借
class MyCar(private val carFromFriend:ICar):ICar{
    override fun start() {
        carFromFriend.start()
    }

    override fun brake() {
        carFromFriend.brake()
    }
}
复制代码

实际的场景像下面这样:

fun main() {
    println("第一天")
    // 首先:找朋友A借了辆车
    val carFromFriendA:ICar = FriendA().getCar()
    // 然后:假装这辆车是自己的车
    var myCar:MyCar = MyCar(carFromFriendA)
    // 接着开出去
    myCar.start()
    myCar.brake()

    println("第二天")
    // 然后第二天,又找朋友B借了车
    val carFromFriendB: ICar = FriendB().getCar()
    // 假装这辆车是自己的
    myCar = MyCar(carFromFriendB)
    // 开出去
    myCar.start()
    myCar.brake()
}
复制代码

控制台打印出来是下面这样的:

第一天

AUDI start now

AUDI brake now

第二天

BMW start now

BMW brake now

kotlin提供的委托特性

我们可以看到MyCar类中的start()brake()只是调用了代理类的同名方法并没有做其他的事情,kotlin提供了by关键字能帮我们减少委托时的样板代码,我们可以重写MyCar类:

// 我自己没有车,得从外边借
class MyCar(carFromFriend:ICar):ICar by carFromFriend{
    
}
复制代码

这里的by语句表示,将 carFromFriend 保存在 MyCar 的对象实例内部,而且编译器将会生成继承自 ICar 接口的所有方法, 并将调用转发给 carFromFriend。 最后附上Github链接,欢迎大家去看看。

Github链接 github.com/Junp3ng/Kee…

参考

一文彻底搞懂Kotlin中的委托

kotlin委托|菜鸟教程

文章分类
代码人生
文章标签