您的位置:首页 > 编程语言 > Java开发

Java代理模式 静态代理 动态代理

2014-12-04 16:55 344 查看
静态代理

比如说有一个添加的方法需要记录日志,但又不想修改添加的方法,我们可以采用静态代理,这样的好处是业务类只要关注自己的业务逻辑,保证了重用性,其他的业务如记录日志,权限检查等交给其他的业务类去做

定义接口

public interface User {
public void add();
public void delete();
}

被代理的类 要实现User接口

public class UserImp implements User {
@Override
public void add() {
System.out.println("添加用户...");
}
@Override
public void delete() {
System.out.println("删除用户...");
}
}

代理类 UserProxy 要和被代理的类UserImp实现同一个User接口

public class UserProxy implements User {
private UserImp userImp;
public UserProxy(UserImp userImp) {
this.userImp = userImp;
}
@Override
public void add() {
System.out.println("开始记录日志");
userImp.add();
System.out.println("记录日志结束");
}
@Override
public void delete() {
System.out.println("开始记录日志");
userImp.delete();
System.out.println("记录日志结束");
}
}


测试类

public class Test {
public static void main(String[] args) {
UserProxy proxy = new UserProxy(new UserImp());
proxy.add();
System.out.println("---------------");
proxy.delete();
}
}

控制台输出

开始记录日志
添加用户...
记录日志结束
---------------
开始记录日志
删除用户...
记录日志结束

静态代理要为每个类创建代理类,如果类很多,我们需要创建很多代理类,而且每个方法(add(),delete())都要手动添加日志功能,比较麻烦,所以可以使用动态代理针对某个功能(如日志,权限等)提供一个代理类。

动态代理

继续使用上面的User接口和UserImp类,新加动态代理的类LogProxy,动态代理的类要实现InvocationHandler接口

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class LogProxy implements InvocationHandler {

// 目标对象
private Object obj;

public Object bind(Object obj) {
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), //
obj.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object object = null;
System.out.println("开始记录日志");
object = method.invoke(obj, args);
System.out.println("记录日志结束");
return object;
}

}


测试类

public class Test {
public static void main(String[] args) {

LogProxy proxy = new LogProxy();

User user = (User) proxy.bind(new UserImp());
user.add();
System.out.println("---------------");
user.delete();
}
}


控制台输出

开始记录日志
添加用户...
记录日志结束
---------------
开始记录日志
删除用户...
记录日志结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: