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

静态代理

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

定义接口

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();
	}
}


控制台输出

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


 


 

你可能感兴趣的:(Java,设计模式,Java代理模式,静态代理,动态代理,Java设计模式)