公用接口
首先要定义一个公共的接口,供代理类和被代理类实现
public interface IUserDao {
void get();
void set();
}
被代理类
/**
* 被代理类
* @author Murphy
*
*/
public class UserDao implements IUserDao {
@Override
public void get() {
System.out.println("我是get方法");
}
@Override
public void set() {
System.out.println("我是set方法");
}
静态代理
静态代理,简单点来说就是在程序运行之前,代理类和被代理类的关系已经确定。
/**
* 代理类
* @author Murphy
*
*/
public class UserDaoProxy implements IUserDao{
private UserDao user= new UserDao();
@Override
public void get() {
System.out.println("我是静态代理类,我要加一段执行get方法的日志");
user.get();
}
@Override
public void set() {
System.out.println("我是静态代理类,我要加一段执行set方法的日志");
user.set();
}
}
优点:
代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
代理对象可以扩展目标对象的功能
代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度
缺点:
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护
JDK动态代理
JDK提供了动态代理的方式,可以生成代理类,解决了静态代理的不足。
/**
* 动态代理
* @author Murphy
*
*/
public class DynamicProxy implements InvocationHandler{
private IUserDao user = null;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=null;
System.out.println("开始JDK动态代理");
method.invoke(user, args);
System.out.println("结束JDK动态代理");
return result;
}
public DynamicProxy(IUserDao user){
this.user=user;
}
}
执行类
public class Run {
public static void main(String[] args) {
/**
*静态代理
*/
IUserDao iuser = new UserDaoProxy();
iuser.get();
iuser.set();
System.out.println("____________________假装分割线_____________________");
/**
* 动态代理
*/
UserDao ud=new UserDao();
DynamicProxy dp=new DynamicProxy(ud);
//生成代理对象
IUserDao iud=(IUserDao)Proxy.newProxyInstance(ud.getClass().getClassLoader(), ud.getClass().getInterfaces(), dp);
iud.get();
iud.set();
}
}
运行结果:
我是静态代理类,我要加一段执行get方法的日志
我是get方法
我是静态代理类,我要加一段执行set方法的日志
我是set方法
____________________假装分割线_____________________
开始JDK动态代理
我是get方法
结束JDK动态代理
开始JDK动态代理
我是set方法
结束JDK动态代理

被折叠的 条评论
为什么被折叠?



