【设计模式】代理模式——详解静态代理&动态代理

内容由B站UP主动力节点产出,本文仅作为学习笔记

代理模式

定义:为对象提供一种代理,以控制这个对象的访问操作。代理对象和目标对象之间起到中介的作用。
作用:保护目标对象和增强目标对象

举例说明,以一个订单对象为例:

class Order{
	private String info;
	private String userId;

	// getter & setter
}

interface OrderDao{
	int insert(Order order);
}

interface OrderService{
	int saveOrder(Order order);
}

class OrderServiceImpl implements OrderService{
	private OrderDao orderDao;

	@Override
	int saveOrder(Order order){
		orderDao = new OrderDao();
		return orderDao.insert(order);
	}
}

静态代理

  • 在编译期间就已经确定了代理类和被代理类的关系,代理类是在编译期间就已经存在的。
  • 静态代理需要为每个被代理的类创建一个代理类,因此如果需要代理多个类,就需要编写多个代理类。
  • 静态代理在编译时就确定了代理对象,因此不太灵活,不方便扩展。
class OrderServiceImplStaticProxy{
	private OrderService orderService;

	// 代理对象调用业务方法
	int saveOrder(Order order){
		orderService = new OrderServiceImpl();
		// 执行代理业务逻辑,以事务为例
		// 开启事务
		before();
		// 代理对象调用业务层
		orderService.saveOrder(order);
		// 关闭事务
		after();
	}

	void before(){
		System.out.println("开启事务");
	}

	void after(){
		System.out.println("关闭事务");
	}
}

动态代理

  • 动态代理是在运行时动态生成的代理类,不需要预先为每个被代理的类创建代理类,而是在程序运行过程中动态生成代理类。
  • 动态代理可以代理多个类,只需要一个代理类即可,因此更灵活,扩展性更好。
  • 动态代理方式有Cglib和JDK,原理相同,此处以JDK为例。JDK中主要使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler, 即增强处理器接口实现。
public class DynamicProxy implements InvocationHandler{
	private Object service;

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

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
		before();
		method.invoke(service, args);
		after();
		return invoke;
	}

	void before(){
		System.out.println("开启事务");
	}

	void after(){
		System.out.println("关闭事务");
	}
}

public class Test{
	public static void main(String[] args) {
		OrderService proxy = (OrderService) new DynamicProxy(new OrderServiceImpl()).bind();
		
		Order order = new Order();
		order.setInfo("购买手机");
		order.setUserId("2");

		proxy.saveOrder(order);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值