代理模式笔记

本文详细介绍了代理模式在SpringAOP中的应用,通过静态代理和动态代理展示了如何实现业务的横向扩展。静态代理中,通过创建代理类实现接口并控制直系角色的行为。动态代理则利用反射机制动态生成代理,避免了类爆炸的问题。两种代理模式各有优缺点,动态代理更具有灵活性。
摘要由CSDN通过智能技术生成

代理模式是我们SpringAOP的底层,使用代理模式可以使得我们的程序横向发展,实现业务上的分工。

代理模式UML图:
在这里插入图片描述
步骤:
抽象角色:一般使用接口或者抽象类实现(农场)
直系角色:实现接口的角色,被代理的对象(老板)
代理角色:实现接口,依赖于直系角色,直接接触客户(代理)
客户:接触代理角色(我)

静态代理

农场:

public interface Farm {
	public void product();
}

老板:

public class Boss implements Farm{

	@Override
	public void product() {
		System.out.println("卖产品了");		
	}
	
}

代理:

public class Proxy implements Farm{

	private Boss boss;
		
	public Proxy() {
		
	}

	public void setProxy(Boss boss) {
		this.boss = boss;
	}


	@Override
	public void product() {
		order();
		boss.product();
		charge();
	}
	
	public void order() {
		System.out.println("接单");
	}
	
	public void charge() {
		System.out.println("收钱");		
	}
	

}

我:

public class Me {
	public static void main(String[] args) {
		
		Proxy proxy = new Proxy();
		proxy.setProxy(new Boss());
		proxy.product();
	}
}

优点:

  1. 直系角色只关注最终结果,不需要关心业务。
  2. 实现了业务统一管理

缺点:
一个直系角色有一个代理,角色多将类爆炸。

动态代理

使用动态代理我们不在去写死我们的代理,而是使用反射机制动态生成一个代理。
代理处理程序:

public class ProxyInvocationHandler implements InvocationHandler{

	//被代理的接口
	private Object farm;
	
	public void setFarm(Farm farm) {
		this.farm=farm;
	}
	
	//生成代理
	public Object getProxy() {
		return Proxy.newProxyInstance(this.getClass().getClassLoader(), farm.getClass().getInterfaces(), this);
	}
	
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//代理方法从farm中得到
		order();
		Object result = method.invoke(farm, args);
		return result;
	}
	
	
	//代理做的事情
	public void order() {
		System.out.println("接单");
	}

}

我:

public class Me {
	public static void main(String[] args) {
		//创建代理对象处理程序
		ProxyInvocationHandler handler = new ProxyInvocationHandler();
		//代理的对象
		handler.setFarm(new Boss());
		
		//生成代理
		Farm proxy = (Farm)handler.getProxy();
		
		proxy.product();
		
	}
}

优点:

  1. 具备静态代理的优点
  2. 不再需要写代理类,调用代理处理程序生成动态代理,只需要提供代理的接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liaoMITC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值