Kotlin中的代理类

前言

Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成为Android官方开发语言

java中的代理

在某些场景中,我们不希望直接去和某些对象进行接触,这样时为了对其进行保护,或者需要隐藏它的一些信息不被暴露,以及节省对象创建的消耗,还有就是在分布式系统的差异性不适合直接进行访问,需要将操作者和实际对象进行隔离,我们一般会找一个类似于中间人的角色,通过这个中间人间接的和源对象进行交互,这种就是我们会使用到代理的场景,也就是代理模式或者中间人模式,由代理层去处理对象优化,访问控制,差异性管理

java中常用的分别是动态代理,以及静态代理

静态代理
有这样一个场景,我们需要获取调用网络数据,并且这个数据会很频繁的被使用,如果直接每次都去服务端获取数据,则会存在性能问题,这种情况下我们可以使用一个代理层去进行数据访问的管理,只有在数据过期之后才调用网络服务,其他情况下使用本地缓存,对于访问层只需要和代理层进行沟通即可

首先由于代理和真实数据访问都有一个功能上共同点就是进行数据的获取,需要将他们的共同行为进行抽离

interface Request{
    String getData();
}

然后分别做代理层和正式访问层的实现

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;
    }
}

在访问时直接与代理进行沟通即可

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

动态代理
代理类扩展了实际的正常业务,对正常业务做了扩展,而又不干预正常的业务,动态代理我们可以使用JDK中的API去动态的为我们生成代理类

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;
    }
}

在调用处自动生成代理类

Request request = new HttpRequest();
ProxyHandler handler = new ProxyHandler(request);
//自动生成代理类
Request proxyRequest= (Request)Proxy.newProxyInstance(request.getClass().getClassLoader(),request.getClass().getInterfaces(),handler);
proxyRequest.getData();

Kotliin中的代理

代理类

Kotlin可以使用by进行类的代理,实现上述功能

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
    }
}

也可以代理类中的一部分函数

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函数,printMessageLine还是按照BaseImpl原有的实现

欢迎关注Mike的

Android 知识整理

你可能感兴趣的:(Kotlin中的代理类)