内容由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);
}
}