概述
代理模式对真实对象添加了一个代理,屏蔽了客户端对真实对象的访问。打个比方,真实对象就是某个明星,代理对象则为明星的经纪人,我们想请某个明星唱歌演出,一般是和经纪人接触,很少和明星直接接触。
代理模式的作用
- 屏蔽对真实对象的访问(客户访问经纪人,而不是直接访问明星)。
- 对真实对象的增加功能。(明星演出不仅仅是上个台表演一下就完事儿了,会涉及到很多额外工作,比如演出前安排人员和场地,演出后安排明星下榻酒店等)。
- 控制真实对象的执行流程 (例子同上)。
代码展示
下面以明星,经纪人,客户为例子展示代理模式,以下代码体现了代理模式增加功能的作用。
// 明星接口
public interface Star {
// 明星演出
void actoin();
}
// 明星周杰伦类
public class JayChou implements Star {
public void action() {
System.out.println("----唱首《告白气球》----");
}
}
// 周杰伦经纪人
public class JingJiRen implements Star {
private JayChou jc;
public JingJiRen() {
jc = new JayChou;
}
// 演出前
public void preAction() {
System.out.println("----安排周杰伦唱歌乐队,场地和资金等----");
}
// 演出后
public void postAction() {
System.out.println("----安排周杰伦下榻酒店等----");
}
//正式演出
public void action() {
preAction();
jc.action();
postAction();
}
}
//客户
public static void main(String[] args) {
Star jjr = new JingJiRen();
jjr.action();
}
代理模式的实现方式
下面列举Java中3种代理模式的实现方式,并进行简单描述。具体实现在以后的文章中讨论。
静态代理。即手动新建代理类,然后编写相关代码。使用静态代理时,由于多写了一个代理对象,一旦接口增加方法,那么被代理类和代理类都要修改,比较麻烦,使用动态代理可以解决这个问题。
动态代理。使用JDK的API,实现代理对象的自动生成。
Cglib代理。上面的静态代理和动态代理模式都是要求目标对象是实现一个接口的目标对象,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以使用以目标对象子类的方式类实现代理,这种方法就叫做:Cglib代理
代理模式的使用场景
- 缓冲代理。比如图片加载,存储已经加载好的图片,若已经加载过了,则直接访问本地图片,不用再次加载。
- 保护代理。为不同级别的客户提供不同的访问权限。
- 远程代理。使得客户端能够访问远程主机上的对象,并且屏蔽网络传输等细节,客户端使用代理对象时不用主动访问网络。
- 其他。
代理模式的优缺点
优点
- 将调用者和真实被调用对象分离,降低系统耦合度。
- 屏蔽了真实对象,起到了保护作用。
缺点:
- 会增加代理对象,对与某些对象比较多的场景,会编写过多代理对象,修改也变得麻烦。
- 增加了系统的复杂度。