- java的委派模式:设计模式中的一种,在生活中常见的一种场景:经纪人场景,中介等现实场景,在java逻辑中多适用于不想对外公开细节和逻辑处理外需要添加一些额外逻辑的场景。
- 委托模式对象:逻辑接口:真实实现对象:委托对象,需要注意的是委托对象持有的是逻辑接口(即并不固定被代理对象,被代理对象test时候注入)且委托对象和真实实现对象一致也实现了逻辑接口不同的是 在实现方法中使用持有的对象实现具体的逻辑。
- 委托模式和代理模式的区别:
- 代理模式目标明确,即代理和被代理的关系
- 代理仅仅是被代理者的逻辑的代理执行,委托不是,委托在执行的同时或者前后可以执行自己的逻辑。
- 二者及其相似,包括逻辑代码,委托模式和静态代理模式代码都相近,所以上面第二条也没有分的那么清楚。
-
kotlin 委托模式:和java的委派模式的原理一致,不同的是语法简化了很多,如下:
委派模式
备注:
- 主构造方法持有了被委托对象,通过实习语法实现了逻辑接口 通过by关键字将调用转发给b。
- kotlin的委托类和java不一样,不需要在重写的方法中再调用被委托对象的方法,且kotlin中都不需要写对应的函数(可以写且可以在函数体中不调用重写函数体)。
-
委托类中通过实现接口重写接口中的函数,在函数中重写了函数体,没有调用被委托对象的函数,则此时函数执行不会执行被委托对象的函数而是单纯的执行委托类的函数。
重写委托类的函数
-
委托类声明的属性,在被委托对象的委托函数中不能调用,很正常,被委托对象没有权限访问委托对象的属性。
属性权限
- 委托属性:
-
解决问题:具有共性的属性有两种实现:一种是每一个使用的地方声明并赋值,还有一种是封装到一个对象中通过对象的属性set和get控制属性,kotlin的属性委托即实现了后面的封装。比如:
共性属性类型
-
普通属性委托的语法:val/var <property name>: <Type> by <expression>
属性委托语法
属性委托参数解释
属性委托使用
-
kotlin针对属性委托的类的语法提供了接口实现即需 operator方法的 ReadOnlyProperty / ReadWriteProperty 接口,在属性委托的类直接实现接口重写系统定义的方法即可,简化了普通属性委托的语法格式:即:
属性委托接口
系统接口属性委托实现
-
kotlin系统提供了几种特殊属性委托机制:
共性属性类型
备注:
- 第一种为第一次访问属性初始化,后续访问属性不再初始化而是获取第一次的值。第二种是属性添加监听类似于数据库的数据监听,监听其每一次数据的变化,在onchange中可以监听到属性的每一次变化,第三种是数据保存到map中使用map委托实现数据的获取(暂时想不到使用场景)。
- 延迟属性:lazy
- lazy延迟属性语法:lazy延迟属性接受参数(参数主要是处理多线程修改属性的线程安全,none:初始化及其所有获取都在同一线程使用,syn:线程安全,即其他线程获取等待第一次访问初始化完成 pub:初始化可以多线程访问,但是后续获取的值只有第一次的值为后续值)通常在使用过程中使用none:单线程访问属性 syn 多线程但是枷锁。具体详情参考参考文章。
- 可观察属性 Observable:
- 属性委托语法(两个参数:初始值和后续修改的值监听函数)具体的语法参考参考文章。
- map委托具体参考参考文章即可。
-
-
属性委托:将属性委托给另一个属性:语法上在by后面使用::标识符标识。使用场景:一是新属性通过委托旧属性随着旧属性的变化而变化,属性修改名字但是兼容旧属性。
属性委托
属性委托2
-
局部的委托属性:
局部属性委托
参考文章:
一文讲明白kotlin的委托:特别是属性委托
网友评论