定义
是指客户端并不能直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。
提供了对目标对象的间接访问方式,即通过代理访问目标对象。如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能的特点也为多人所用。
静态代理的实现比较简单。
package com.zlfan.proxy;
public interface Business {
void coding();
}
package com.zlfan.proxy;
public class BusinessImpl implements Business {
@Override
public void coding() {
System.out.println("写代码");
}
}
package com.zlfan.proxy;
public class BusinessProxy implements Business{
private Business bsimpl;
public BusinessProxy(Business business){
super();
this.bsimpl = business;
}
@Override
public void coding() {
System.out.println("写代码前做...");
bsimpl.coding();
System.out.println("写代码后做...");
}
}
package com.zlfan.proxy;
public class Test {
public static void main(String[] args) {
Business bsProxy = new BusinessProxy(new BusinessImpl());
bsProxy.coding();
}
}
运行结果
写代码前做...
写代码
写代码后做...
关键点:
- 代理类与委托类实现同一接口。
- 在委托类中实现功能,在代理类的方法中引用委托类的同名方法。
- 外部类调用委托类的某个方法时,直接以接口指向,代理类的实例,这正是代理的意义所在:屏蔽。
适用性:
Proxy模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候,常见情况有:
- 远程代理为一个对象在不同的地址空间提供局部代表。
- 虚代理,根据需要创建开销很大的对象。
- 保护代理,控制对原始对象的访问,用于对象应该有不同的访问权限的时候。
- 智能引用取代了简单的指针,它在访问对象时执行了一些额外的操作。典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放;当第一次引用一个持久对象时,将它装入内存;在访问一个实际对象前,检查是否锁定了它,以确保其他对象不能改变它。