前言
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í)整理