美文网首页kotlin
Kotlin中的代理类

Kotlin中的代理类

作者: 盛世光阴 | 来源:发表于2021-06-14 23:06 被阅读0次

前言

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中的代理类

    前言 Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,在Goo...

  • kotlin-第三章(类与对象)

    构造函数 访问修饰符 伴生对象 单例类 动态代理 kotlin中特有的类 09:kotlin的构造函数 kotli...

  • 探究 Kotlin 类代理

    Kotlin 实现类代理是通过 by 关键字,本文尝试讲解类代理在 Kotlin 的具体使用和实现原理。 首先,在...

  • 快速上手 Kotlin 开发系列之动态代理

    本节介绍 Kotlin 中没有反射的动态代理。 Java 中的动态代理 在讲 Kotlin 的动态代理之前先简单回...

  • kotlin中的面相对象

    目录 抽象类与接口 多态和接口代理 kotlin中接口函数冲突问题 类及其成员的可见性 object(单例模式) ...

  • Kotlin中的面向对象详解

    目录 抽象类与接口 多态和接口代理 kotlin中接口函数冲突问题 类及其成员的可见性 object(单例模式) ...

  • Kotlin学习(二)类

    Kotlin类 1.类的声明 Kotlin中类使用class进行声明,主构造函数直接定义在类头: Kotlin中类...

  • 3.接口代理

    接口方法交给代理类实现 关键字 by 其中用kotlin接口代理,SeniorManager可以这样写

  • About Kotlin-Kotlin中的类2

    About Kotlin(2) 继续昨天的部分。介绍Kotlin中的类。 Kotlin中的类 抽象类和接口 抽象类...

  • Kotlin基础(10)-代理模式在kotlin中的使用

    前言 本文简要介绍代理模式在kotlin中的使用 手写一个代理模式 定义一个接口中定义行走方法,并在坦克类中实现行...

网友评论

    本文标题:Kotlin中的代理类

    本文链接:https://www.haomeiwen.com/subject/gqdfeltx.html