一、前言:
代理模式的基本介绍:
- 代理模式:为一个对象提供替身,引用代理可以在目标对象的基础上,可以增加额外的操作,即扩展目标对象的功能。
- 被代理的对象可视为远程对象、创建开销大的对象、需要安全控制的对象。
- 代理对象的不同形式:静态代理、动态代理、Cglib 代理。
二、静态代理模式:
2.1、UML 图:
2.2、代码实例:
Step 1) 创建 IteacherDao 接口:
public interface IteacherDao {
void teach();
}
Step 2) 创建 TeacherDAO 实现类:
public class TeacherDAO implements IteacherDao {
@Override
public void teach() {
System.out.println("老师授课中。。。");
}
}
Step 3) 创建 TeacherDaoProxy 实现类:
public class TeacherDaoProxy implements IteacherDao {
private IteacherDao target;
public TeacherDaoProxy(IteacherDao target) {
this.target = target;
}
@Override
public void teach() {
System.out.println("开始代理。。。完成操作 !");
target.teach();
System.out.println("提交。。。");
}
}
Step 4) 创建 main 方法:
public class Client {
public static void main(String[] args) {
System.out.println("----------静态代理----------------");
TeacherDAO teacherDAO = new TeacherDAO();
TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDAO);
teacherDaoProxy.teach();
}
}
三、动态代理模式:
3.1、UML 图:
3.2、代码实例:
Step 1) 创建 IteacherDao 接口:
public interface IteacherDao {
void teach();
void sqyHello(String name);
}
Step 2) 创建 TeacherDAO 实现类:
public class TeacherDAO implements IteacherDao {
@Override
public void teach() {
System.out.println("老师授课中。。。");
}
@Override
public void sqyHello(String name) {
System.out.println("hello:"+name);
}
}
Step 3) 创建 ProxyFactory 实现类:
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK 代理开始。。。");
Object returnVal = method.invoke(target, args);
System.out.println("JDK 代理提交。。。");
return returnVal;
}
});
}
}
Step 4) 创建 main 方法:
public class Client {
public static void main(String[] args) {
System.out.println("---------------动态代理---------------");
IteacherDao target = new TeacherDAO();
IteacherDao proxyInstance = (IteacherDao) new ProxyFactory(target).getProxyInstance();
System.out.println("proxyInstance:" + proxyInstance.getClass());
proxyInstance.sqyHello("tom");
}
}
四、Cglib 代理模式:
3.1、UML 图:
3.2、代码实例:
Step 1) :下载并代入 Cglib.jar 包
百度云网盘:https://pan.baidu.com/s/1aAjrJz-jqH6ehEdcuvms1A
(提取码:01nm
)
Step 2) 创建 TeacherDAO 类:
public class TeacherDAO {
public void teach() {
System.out.println("老师授课中。。。我是 Cglib 代理,不需要实现接口");
}
}
Step 3) 创建 ProxyFactory 实现类:
public class ProxyFactory implements MethodInterceptor {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("Cglib 代理开始。。。");
Object returnVal = method.invoke(target, args);
System.out.println("Cglib 代理提交。。。");
return returnVal;
}
}
Step 4) 创建 main 方法:
public class Client {
public static void main(String[] args) {
System.out.println("-----------Cglib 代理-----------");;
TeacherDAO target = new TeacherDAO();
TeacherDAO proxyInstance = (TeacherDAO) new ProxyFactory(target).getProxyInstance();
System.out.println("proxyInstance:" + proxyInstance.getClass());
proxyInstance.teach();
}
}
• 由 ChiKong_Tam 写于 2020 年 10 月 19 日