代理模式

学习一下代理模式

什么是代理模式(proxy)

delegate n. 代表 v. 授(权);把(工作、权力等)委托(给下级)…

proxy 代理

仔细看一下 这两个单词的翻译,是不是理解了点什么呢? UIKit中的delegate(委托)类似于c、c++中的函数指针。可以理解为一种依赖注入,常见为set设置和对象初始化时注入。常用于实现事件和回调方法。

tableView中delegate委托模式和dataSource数据源模式,分别对于于事件/行为的传递和数据的传递。

UIView作为layer的delegate,也算是职责分离的方式,layer负责显示渲染,view负责响应事件。

委托模式(delegate)的主要应用场景:一件事或请求,对象本身不知道怎么处理,把请求交给其他对象来做。(这里表达的不清楚,个人理解就是分离功能职责)

代理模式(proxy)是为其他对象提供一种代理,以控制对这个对象的访问。常见的有保护代理(访问权限控制)、远程代理、虚拟代理、缓冲代理等

这两者概念上还是相差很大的,proxy模式里,访问时只能访问套在真实主题外的代理对象

Proxy可以理解为,在目标对象之前架设一层‘拦截’,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

JavaScript中的代理

ES6中原生提供Proxy构造函数,用来生成Proxy实例

var proxy = new Proxy(target, handler)

new Proxy()表示生成一个Proxy实例,target参数表示所要拦截的目标对象,handler参数表示用来定制拦截行为的对象。


Java中的动态代理

在java.lang.reflect包下提供一个Proxy类和一个InvocationHandler接口,通过这个类和接口可以生成JDK动态代理类和动态代理对象

public class NormalHandler implements InvocationHandler {
    private Object target;

    public NormalHandler(Objcet target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(target, args);
        return null;
    }
}


OC中常使用对象的地方,比如,控制器传的是对象; 而安卓中却使用类,

[self.navigationController pushViewController:vc animated: YES]
Intent intent = new Intent(MainActivity.this, otherActivity.class);
startActivity(intent);

引用源

Written on October 14, 2020