代理模式在现实生活中有很多例子,就例如手机销售,就会设立很多代理销售点,然后人们就可以在代理销售点进行手机的购买,
在Kotlin中,有两种方式来实现代理模式,静态代理和动态代理
静态代理
interface PhoneSell{
fun sell()
}
class MainPhoneSell: PhoneSell{
override fun sell() {
println("手机销售")
}
}
class ProxyPhoneSell: PhoneSell{
private val mainPhoneSell = MainPhoneSell()
override fun sell() {
println("赚取200元服务费")
mainPhoneSell.sell()
}
}
fun main(){
ProxyPhoneSell().sell()
}
静态代理比较简单,就是代理拿到被代理的一个实例,然后调用被代理实例的方法就行了,同时也对sell方法进行了增强
动态代理
interface PhoneSell{
fun sell()
}
class MainPhoneSell: PhoneSell{
override fun sell() {
println("手机销售")
}
}
class ProxyFactory(){ //工厂方法模式
private val phoneSell = MainPhoneSell()
fun getProxy() = Proxy.newProxyInstance(phoneSell.javaClass.classLoader,phoneSell.javaClass.interfaces
) { proxy, method, args ->
println("收取200元服务费")
method.invoke(phoneSell,*args.orEmpty())
} as PhoneSell
}
动态代理就是调用java中提供的一个动态代理类Proxy,然后通过其中的方法newProxyInstance来创建代理,
动态代理与静态代理
虽然静态代理对于新手来说比较友好,但是在于代码的复用和维护性上,还是动态代理更好一点,因此推荐使用动态代理
优点
代理模式能够将客户端和目标对象分离,能够保护对象
代理模式能够扩展目标对象的功能
缺点
增加了代码的复杂度