代理的定义:我代表/代替你处理你的事情。
我们先来定义一个接口:
interface Api{
fun create()
fun prepare()
fun start()
fun end()
}
再来看看他的实现类ApiImpl.kt :
class ApiImpl:Api {
override fun create() {
println("create()")
}
override fun prepare() {
println("prepare()")
}
override fun start() {
println("start()")
}
override fun end() {
println("end()")
}
}
这里很简单,没有什么需要特别说的。
然后再来看看另一种实现:
class ApiRoutine(val api: Api):Api {
override fun create() {
api.create()
}
override fun prepare() {
api.prepare()
}
override fun start() {
api.start()
}
override fun end() {
api.end()
}
}
上面api的说明:
“api: Api”里面的“api”对象是其他的实现了Api接口的类的对象:
var mApiImpl = ApiImpl()
var apiWrapper = ApiWrapper(mApiImpl)
其实这两种实现都是常规的实现,跟我们之前了解的接口实现并无不同。
我们再来看看如何实现 代理:
class ApiDelegate(val api: Api):Api by api {
override fun prepare() {
println("prepare is Cancelled")
}
}
说明:
1、上面“:Api by api”的含义:对象“api”代替类“ApiDelegate”实现Api接口
2、对于对象api的唯一要求:实现被代理Api的接口
3、优点:只需要实现想要实现的某一个或者某几个方法,而不是全部方法。就比如上面的“ApiDelegate”,这里我们就只是实现了“prepare()”这一个方法。
在main()方法里面的调用:
var mApiImpl = ApiImpl()
var apiWrapper = ApiRoutine(mApiImpl)
apiWrapper.create()
var apiDelegate = ApiDelegate(mApiImpl)
apiDelegate.prepare()
结果如下: