Kotlin中的代理類

前言

Kotlin是一種在Java虛擬機(jī)上運(yùn)行的靜態(tài)類型編程語言,被稱之為Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成為Android官方開發(fā)語言

java中的代理

在某些場(chǎng)景中,我們不希望直接去和某些對(duì)象進(jìn)行接觸,這樣時(shí)為了對(duì)其進(jìn)行保護(hù),或者需要隱藏它的一些信息不被暴露,以及節(jié)省對(duì)象創(chuàng)建的消耗,還有就是在分布式系統(tǒng)的差異性不適合直接進(jìn)行訪問,需要將操作者和實(shí)際對(duì)象進(jìn)行隔離,我們一般會(huì)找一個(gè)類似于中間人的角色,通過這個(gè)中間人間接的和源對(duì)象進(jìn)行交互,這種就是我們會(huì)使用到代理的場(chǎng)景,也就是代理模式或者中間人模式,由代理層去處理對(duì)象優(yōu)化,訪問控制,差異性管理

java中常用的分別是動(dòng)態(tài)代理,以及靜態(tài)代理

靜態(tài)代理
有這樣一個(gè)場(chǎng)景,我們需要獲取調(diào)用網(wǎng)絡(luò)數(shù)據(jù),并且這個(gè)數(shù)據(jù)會(huì)很頻繁的被使用,如果直接每次都去服務(wù)端獲取數(shù)據(jù),則會(huì)存在性能問題,這種情況下我們可以使用一個(gè)代理層去進(jìn)行數(shù)據(jù)訪問的管理,只有在數(shù)據(jù)過期之后才調(diào)用網(wǎng)絡(luò)服務(wù),其他情況下使用本地緩存,對(duì)于訪問層只需要和代理層進(jìn)行溝通即可

首先由于代理和真實(shí)數(shù)據(jù)訪問都有一個(gè)功能上共同點(diǎn)就是進(jìn)行數(shù)據(jù)的獲取,需要將他們的共同行為進(jìn)行抽離

interface Request{
    String getData();
}

然后分別做代理層和正式訪問層的實(shí)現(xiàn)

class HttpRequest implements Request {

    @Override
    public String getData() {
        return "network data";
    }
}

class ProxyRequest implements Request {

    private HttpRequest request = new HttpRequest();

    private String data = "";

    private long lastRequestTime = 0;

    @Override
    public String getData() {
        if (System.currentTimeMillis() - lastRequestTime > 2 * 60 * 1000) {
            data = request.getData();
            lastRequestTime = System.currentTimeMillis();
        }
        return data;
    }
}

在訪問時(shí)直接與代理進(jìn)行溝通即可

Request request = new ProxyRequest();
request.getData();    

動(dòng)態(tài)代理
代理類擴(kuò)展了實(shí)際的正常業(yè)務(wù),對(duì)正常業(yè)務(wù)做了擴(kuò)展,而又不干預(yù)正常的業(yè)務(wù),動(dòng)態(tài)代理我們可以使用JDK中的API去動(dòng)態(tài)的為我們生成代理類

class ProxyHandler implements InvocationHandler{
    private Request request;
    private String data = "";
    private long lastRequestTime = 0;

    public ProxyHandler(Request request){
        this.request = request;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (System.currentTimeMillis() - lastRequestTime > 2 * 60 * 1000) {
            data = (String) method.invoke(request,args);
            lastRequestTime = System.currentTimeMillis();
        }
        return data;
    }
}

在調(diào)用處自動(dòng)生成代理類

Request request = new HttpRequest();
ProxyHandler handler = new ProxyHandler(request);
//自動(dòng)生成代理類
Request proxyRequest= (Request)Proxy.newProxyInstance(request.getClass().getClassLoader(),request.getClass().getInterfaces(),handler);
proxyRequest.getData();

Kotliin中的代理

代理類

Kotlin可以使用by進(jìn)行類的代理,實(shí)現(xiàn)上述功能

interface Request {
    fun getData(): String
}

class HttpRequest : Request {
    override fun getData(): String {
        return "network data"
    }
}

class ProxyRequest(val request : Request) : Request by request{
    var value = ""
    private var lastRequestTime: Long = 0
    override fun getData(): String {
        if (System.currentTimeMillis() - lastRequestTime > 2 * 60 * 1000) {
            value = request.getData()
        }
        return value
    }
}

也可以代理類中的一部分函數(shù)

interface Base {
    fun printMessage()
    fun printMessageLine()
}

class BaseImpl(val x: Int) : Base {
    override fun printMessage() { print(x) }
    override fun printMessageLine() { println(x) }
}

class Derived(b: Base) : Base by b {
    override fun printMessage() { print("abc") }
}

fun main() {
    val b = BaseImpl(10)
    Derived(b).printMessage() // abc
    Derived(b).printMessageLine() //10
}

Derived只是代理了Base中的printMessage函數(shù),printMessageLine還是按照BaseImpl原有的實(shí)現(xiàn)

歡迎關(guān)注Mike的簡(jiǎn)書

Android 知識(shí)整理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容