Java设计模式之代理模式

1、静态代理

在不改变目标对象的前提下,对目标功能进行扩展

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.

接口

public interface IUser {
	public void name();
}

目标

public class User implements IUser {

	@Override
	public void name() {
		System.out.println("My name is lily");
	}

}

代理

public class PUser implements IUser {
	private User user;

	public PUser(User user) {
		super();
		this.user = user;
	}

	@Override
	public void name() {
		user.name();

	}

}

测试

public class Proxy1 {
	public static void main(String[] args) {
		User user = new User();
		PUser pUser = new PUser(user);
		pUser.name();

	}

}

调用的是代理的方法

静态代理缺点:需要实现所有的接口,目标对象改变,代理需要跟着改变,代码维护比较困难

2、动态代理

代理不需要通过实现接口来完成,而是通过反射的方式来创建动态类

public class ProxyFactory {
	private Object user;

	public ProxyFactory(Object user) {
		super();
		this.user = user;
	}

	// 给目标对象生成代理对象
	public Object getProxyInstance() {
		return Proxy.newProxyInstance(user.getClass().getClassLoader(), user
				.getClass().getInterfaces(), new InvocationHandler() {

			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				Object returnValue = method.invoke(user, args);
				return returnValue;
			}
		});

	}

}

测试  同静态代理一致

public class Proxy2 {
	public static void main(String[] args) {
		IUser user = new User();
		IUser proxy = (IUser) new ProxyFactory(user).getProxyInstance();
		proxy.name();
	}

}

代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值