定义
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。
静态代理
特点:代理类和代理对象同时实现同一个接口
优点:可以做到在不修改目标对象的功能前提下,对目标功能扩展.
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.
用户接口 IUserDao
public interface IUserDao {
void save();
}
目标用户对象 UserDao
public class UserDao implements IUserDao{
/**
* 保存
*/
public void save() {
// TODO Auto-generated method stub
System.out.println("保存用户");
}
}
静态代理用户对象 UserStaticProxy
public class UserStaticProxy implements IUserDao {
private IUserDao target;
public UserStaticProxy(IUserDao target) {
this.target = target;
}
public void save() {
System.out.println("静态代理 - 开始事务");
target.save();//执行目标对象的方法
System.out.println("静态代理 - 提交事务");
System.out.println();
}
}
测试静态用户代理
public class test {
public static void main(String[] args) {
/**
* 静态代理调用
*/
UserDao target = new UserDao();
UserStaticProxy proxy = new UserStaticProxy(target);
proxy.save();
}
}
=========================================================
动态代理
特点:
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理
角色接口 IRoleDao
public interface IRoleDao {
void save();
}
目标角色对象 RoleDao
public class RoleDao implements IRoleDao{
public void save() {
// TODO Auto-generated method stub
System.out.println("保存角色");
}
}
动态代理对象 UserTargetProxy
public class UserTargetProxy {
private Object target;
public UserTargetProxy(Object target){
this.target = target ;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理 - 开始事务");
//执行目标对象方法
Object returnValue = method.invoke(target, args);
System.out.println("动态代理 - 提交事务");
System.out.println();
return returnValue;
}
}
);
}
}
测试静态代理
public class test {
public static void main(String[] args) {
/**
* 静态代理调用
*/
UserDao target = new UserDao();
UserStaticProxy proxy = new UserStaticProxy(target);
proxy.save();
/**
* 动态代理调用用户保存
*/
IUserDao lu = (IUserDao) new UserTargetProxy(target).getProxyInstance();
lu.save();
/**
* 动态代理调用金角色保存
*/
IRoleDao ir = (IRoleDao) new UserTargetProxy(new RoleDao()).getProxyInstance();
ir.save();
}
}
网友评论