动机

在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为「代理」的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

定义

代理模式(Proxy Pattern):给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。它是一种对象结构型模式。

结构

代理模式包含如下角色:

img1.png

代码实现

抽象主题类:

public abstract class Subject {
	public abstract void request();
}

真实主题类:

public class RealSubject extends Subject{

	@Override
	public void request() {
		System.out.println("请求");
	}
}

代理类:

public class Proxy extends Subject {

	private Subject realSubject = new RealSubject();
	/**
	 * 请求前的一些操作
	 */
	public void preRequest(){
		System.out.println("请求前的一些操作");
	}
	/**
	 * 请求后的一些操作
	 */
	public void postRequest(){
		System.out.println("请求后的一些操作");
	}
	@Override
	public void request() {
		preRequest();
		realSubject.request();
		postRequest();
	}
}

客户端:

public class Client {

    public static void main(String[] args) {
        Subject proxy = new Proxy();
        proxy.request();
    }

}

运行结果如下:

请求前的一些操作 请求 请求后的一些操作

模式分析

优点
缺点

几种常见的代理

在 Android 中的应用

ActivityManager 中使用到了代理模式,代理类是ActivityManagerProxy。然后在 Binder 和 AIDL 中也使用到了代理模式。

参考资料

Android源码中的代理模式

代理模式