代理设计模式

代理设计模式

  • 一、静态代理设计模式
  • 二、动态代理模式-基础jdk实现
  • 三、动态代理模式-基础CGLIB实现

一、静态代理设计模式

静态代理:代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象
优点:
可以做到在不修改目标对象的功能前提下,对目标功能扩展.
缺点:
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护。

interface PojoDao {
    void add();
}

class UserDao implements PojoDao {

    @Override
    public void add() {
        System.out.println("添加用户");
    }

}

class UserService implements PojoDao {
    private PojoDao pojoDao;

    public UserService(PojoDao pojoDao) {
        this.pojoDao = pojoDao;
    }

    @Override
    public void add() {
        System.out.println("添加用户前,增加逻辑判断");
        pojoDao.add();
    }

}

public class StaticProxy {
    public static void main(String[] args) {
        UserDao userDao = new UserDao();
        UserService userService = new UserService(userDao);
        userService.add();
    }
}

在这里插入图片描述

二、动态代理模式-基础jdk实现

动态代理:利用拦截器(继承InvocationHandler )加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
基础JDK实现

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface PojoDao {
    void add();
}

class UserDao implements PojoDao {

    @Override
    public void add() {
        System.out.println("添加用户");
    }
}

class UserDaoHandler<T> implements InvocationHandler {

    T dao;

    public UserDaoHandler(T dao) {
        this.dao = dao;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("动态代理-添加业务逻辑处理");
        Object result = method.invoke(dao, args);
        return result;
    }

}

class DynamicProxy {
    public static void main(String[] args) {
        PojoDao pojoDao = new UserDao();

        InvocationHandler userDaoHandler = new UserDaoHandler<PojoDao>(pojoDao);

        PojoDao person = (PojoDao) Proxy.newProxyInstance(PojoDao.class.getClassLoader(),
                new Class<?>[] { PojoDao.class }, userDaoHandler);

        person.add();
    }
}

在这里插入图片描述

三、动态代理模式-基础CGLIB实现

通过开源项目CGLIB实现: 对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理。

可以通过maven项目快速依赖


    cglib
    cglib
    3.3.0

案例:

TODO

你可能感兴趣的:(设计模式)