本文首发于cdream的个人博客,点击获得更好的阅读体验!
欢迎转载,转载请注明出处。
本文主要对设计模式中的代理模式进行讲解,包括静态代理举例,动态代理中的jdk动态代理、cglib动态代理原理分析等几个方面。

一、概念
定义:代理模式(Proxy Pattern)代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的访问。代理对象在客户端了和目标对象之间起到中介作用。
二、结构
UML:
主要角色:
真实主题类:客户端真正想调用的的主题类。
代理类:保存一个真实主题类的引用,使得代理对象可以访问真实主体对象的实体。真实主题类和代理对象都会继承相同的接口:在用到真实主题类的地方都可以使用代理类来完成。
抽象主体:定义真实主题类和代理类的接口。
三、静态代理
虚拟代理
虚拟代理作为创建开销大的对象的代表。直到我们真正使用对象时才会创建它,当对象在创建前和创建中,由虚拟代理来扮演对象的替身。对象创建后,代理会将请求直接委托给对象。
抽象主题接口
public interface LargeObject { /** * 干了一个老大的事了,所以我这个类老大了! */ public void doBigThing(); }具体主题角色,实现了抽象主题接口
public class RealLargeObject implements LargeObject { @Override public void doBigThing() { System.out.println("做了老大的一个事了"); } }现在我们要对类进行访问控制,对"巨型对象"进行延迟创建。
public class ProxyLargeObject implements LargeObject { private LargeObject largeObject; @Override public void doBigThing() { if (largeObject==null){ largeObject = new RealLargeObject(); } largeObject.doBigThing(); } }当时使用代理类时,只有当客户端调用doBigThing方法的时候才会创建LargeObject对象。
当我们需要对开销大的对象进行延迟创建或隐藏其创建过程时可以使用虚拟代理模式。
远程代理
概述
RMI

远程代理RMI允许一个jvm上的对象调用另一个jvm上的对象,流程类似于上面这个图。
客户对象直接调用辅助对象 stub的方法,stub打包调用信息,通过网络把他运送给服务端辅助对象 skeleton,服务端辅助对象进行解包,调用真正服务对象的真正方法。
然后服务对象将结果返回给服务辅助对象,服务辅助对象将结果打包,然后客户服务对象将返回结果解包交给真正客户对象。
由registry来作为注册中心,服务端将对象注册到其中,客户端通过相关方法调用。
源代码
下面来介绍RMI步骤
1.制作远程接口
public
