代理模式分析
简介
代理模式分为:
- 静态代理模式
- 动态代理模式
静态代理模式
静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类,实现方式类似于装饰器模式,但是其目的不一样。
看下类图
代码示例
/*静态代理模式*/
public class StaticProxyModule {
interface IUserDao{
void save();
}
static class UserDaoImpl implements IUserDao{
@Override
public void save() {
System.out.println("save...........");
}
}
static class ProxyDao implements IUserDao{
private IUserDao userDaoImpl;
public ProxyDao(IUserDao userDao) {
this.userDaoImpl = userDao;
}
@Override
public void save() {
userDaoImpl.save();
}
}
public static void main(String[] args){
IUserDao userDao = new UserDaoImpl();
ProxyDao proxyDao = new ProxyDao(userDao);
proxyDao.save();
}
}
优点
- 可以做到在不修改目标对象的功能前提下,对目标功能扩展
缺点
- 因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护
动态代理模式
在程序运行时,通过反射机制动态地创建一个代理类。
- 动态的体现:程序开始执行时是没有代理类的,在程序运行时,java利用反射机制动态生成代理类的实例
- jdk技术支持:java在java.lang.reflect包里提供两个类/接口帮助我们创建和使用代理类实例,一个是Proxy类,一个是InvocationHandler接口
- 两种代理类的模式区别:静态模式要求为程序中所有需要被访问的目标创建代理类,如果有10种代理目标,我们就得创建10个代理类,让代理类直接访问目标对象
类图结构
代码实例
public class SubjectProxyModule {
static class ProxyFactory implements InvocationHandler {
Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(target, args);
}
}
interface SubjectInterface {
void println();
void println111();
}
static class SubjectA implements SubjectInterface{
@Override
public void println() {
System.out.println("哈哈哈哈哈..........");
}
@Override
public void println111() {
System.out.println("哈哈哈哈哈..........11111111111");
}
}
public static void main(String[] args) {
SubjectInterface subjectA = new SubjectA();
SubjectInterface subjectA1 = (SubjectInterface) new ProxyFactory(subjectA).getProxyInstance();
subjectA1.println();
subjectA1.println111();
}
}