代理是什么
首先代理模式是啥呢刮萌?
代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問傻粘。在某些情況下克饶,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用卦停。
代理模式其實(shí)像一個經(jīng)紀(jì)人向胡,一個中介,用于完成某個用戶不方便或者不能做的事情惊完。舉個例子來說明代理的作用:明星與經(jīng)紀(jì)人之間就是被代理和代理的關(guān)系,明星出演活動時不光是演出僵芹,可能還有臺前幕后工作,這時候就需要經(jīng)紀(jì)人去處理這些事情小槐。
接下來用代碼示例
想做一個明星拇派,不光會唱、跳凿跳、rap還要會打籃球件豌,那么就有
interface StarInterface {
fun sing()
fun dance()
fun rap()
fun playBasketball()
}
那么有一個明星想做這些,就要實(shí)現(xiàn)它
class Start(private var name: String) :StarInterface{
override fun sing() {
println(name+"進(jìn)行了唱")
}
override fun dance() {
println(name+"進(jìn)行了跳")
}
override fun rap() {
println(name+"進(jìn)行了rap")
}
override fun playBasketball() {
println(name+"進(jìn)行了打籃球")
}
}
所以控嗜,執(zhí)行時應(yīng)該這樣:
object Main {
@JvmStatic
fun main(args: Array<String>) {
//正常的模式
val kun = Start("cxk")
kun.sing()
kun.dance()
kun.rap()
kun.playBasketball()
}
}
打印結(jié)果:
cxk進(jìn)行了唱
cxk進(jìn)行了跳
cxk進(jìn)行了rap
cxk進(jìn)行了打籃球
靜態(tài)代理
有一個經(jīng)紀(jì)人服務(wù)明星茧彤,做一些前置或者后置的工作
class StartProxy(private var start: StarInterface) :StarInterface {
override fun sing() {
println("經(jīng)紀(jì)人提前準(zhǔn)備唱歌場地")
start.sing()
println("經(jīng)紀(jì)人進(jìn)行唱歌后的善后工作")
}
override fun dance() {
println("經(jīng)紀(jì)人提前準(zhǔn)備跳舞場地")
start.dance()
println("經(jīng)紀(jì)人進(jìn)行跳舞后的善后工作")
}
override fun rap() {
println("經(jīng)紀(jì)人提前準(zhǔn)備rap場地")
start.rap()
println("經(jīng)紀(jì)人進(jìn)行rap后的善后工作")
}
override fun playBasketball() {
println("經(jīng)紀(jì)人提前準(zhǔn)備籃球場")
start.playBasketball()
println("經(jīng)紀(jì)人進(jìn)行打籃球后的善后工作")
}
}
執(zhí)行代碼:
object Main {
@JvmStatic
fun main(args: Array<String>) {
//正常的模式
val kun = Start("cxk")
kun.sing()
kun.dance()
kun.rap()
kun.playBasketball()
println()
println("有了經(jīng)紀(jì)人以后")
println()
//現(xiàn)在需要有經(jīng)濟(jì)人處理一些事宜
val agent = StartProxy(kun)
agent.sing()
agent.dance()
agent.rap()
agent.playBasketball()
}
}
打印:
cxk進(jìn)行了唱
cxk進(jìn)行了跳
cxk進(jìn)行了rap
cxk進(jìn)行了打籃球
有了經(jīng)紀(jì)人以后
經(jīng)紀(jì)人提前準(zhǔn)備唱歌場地
cxk進(jìn)行了唱
經(jīng)紀(jì)人進(jìn)行唱歌后的善后工作
經(jīng)紀(jì)人提前準(zhǔn)備跳舞場地
cxk進(jìn)行了跳
經(jīng)紀(jì)人進(jìn)行跳舞后的善后工作
經(jīng)紀(jì)人提前準(zhǔn)備rap場地
cxk進(jìn)行了rap
經(jīng)紀(jì)人進(jìn)行rap后的善后工作
經(jīng)紀(jì)人提前準(zhǔn)備籃球場
cxk進(jìn)行了打籃球
經(jīng)紀(jì)人進(jìn)行打籃球后的善后工作
動態(tài)代理
首先要對經(jīng)紀(jì)人如何處理做一個規(guī)范
class StartInvocationHandler(private val start:StarInterface) : InvocationHandler {
override fun invoke(proxy: Any?, method: Method, args: Array<Any?>?): Any {
if (method.name=="sing"){
println("唱歌需要找場地")
method.invoke(start)
println("唱歌后的善后")
}else{
println("其他活動")
method.invoke(start)
println("其他活動的善后")
}
return Unit
}
}
執(zhí)行代碼
object Main {
@JvmStatic
fun main(args: Array<String>) {
//正常的模式
val kun = Start("cxk")
kun.sing()
kun.dance()
kun.rap()
kun.playBasketball()
println()
println("有了經(jīng)紀(jì)人以后")
println()
//現(xiàn)在需要有經(jīng)濟(jì)人處理一些事宜
val agent = StartProxy(kun)
agent.sing()
agent.dance()
agent.rap()
agent.playBasketball()
println()
println("使用動態(tài)經(jīng)紀(jì)人以后")
println()
val agentDynamic = Proxy.newProxyInstance(//調(diào)用動態(tài)代理生成的方法來生成動態(tài)代理
kun.javaClass.classLoader,//類加載器對象
kun.javaClass.interfaces,//因?yàn)槲覀兊慕涌诓恍枰^承別的接口,所以直接傳入接口的class就行
StartInvocationHandler(kun))as StarInterface
agentDynamic.sing()
agentDynamic.dance()
agentDynamic.rap()
agentDynamic.playBasketball()
}
}
打印結(jié)果:
cxk進(jìn)行了唱
cxk進(jìn)行了跳
cxk進(jìn)行了rap
cxk進(jìn)行了打籃球
有了經(jīng)紀(jì)人以后
經(jīng)紀(jì)人提前準(zhǔn)備唱歌場地
cxk進(jìn)行了唱
經(jīng)紀(jì)人進(jìn)行唱歌后的善后工作
經(jīng)紀(jì)人提前準(zhǔn)備跳舞場地
cxk進(jìn)行了跳
經(jīng)紀(jì)人進(jìn)行跳舞后的善后工作
經(jīng)紀(jì)人提前準(zhǔn)備rap場地
cxk進(jìn)行了rap
經(jīng)紀(jì)人進(jìn)行rap后的善后工作
經(jīng)紀(jì)人提前準(zhǔn)備籃球場
cxk進(jìn)行了打籃球
經(jīng)紀(jì)人進(jìn)行打籃球后的善后工作
使用動態(tài)經(jīng)紀(jì)人以后
唱歌需要找場地
cxk進(jìn)行了唱
唱歌后的善后
其他活動
cxk進(jìn)行了跳
其他活動的善后
其他活動
cxk進(jìn)行了rap
其他活動的善后
其他活動
cxk進(jìn)行了打籃球
其他活動的善后