目录
什么是代理模式?
为什么要用代理模式?
有哪几种代理模式?
动态代理(jdk自带):
动态代理(第三方库-cglib):
什么是代理模式?
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
通俗的来讲代理模式就是我们生活中常见的中介。
举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。
为什么要用代理模式?
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,
而代理类对象可以在客户类和委托对象之间起到中介的作用,其 特征是代理类和委托类实现相同的接口。
开闭原则,增加功能:
代理类除了是客户类和委托类的中介之外,我们还可以通过给代理 类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。
有哪几种代理模式?
我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:
静态代理:
静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
动态代理:
动态代理是在程序运行时通过反射机制动态创建的。
动态代理分为:
基于接口的动态代理(jdk自带)
基于子类的动态代理(第三方)
动态代理(jdk自带):
代码示例:
//接口类
public interface ISinger {
public void singer();
public int dance(int n);
}
//实现类
public class Xiaomei implements ISinger{
@Override
public void singer() {
System.out.println("=====唱一首狼的诱惑=====");
}
@Override
public int dance(int n) {
System.out.println("=====跳一个昆卡=====");
return 0;
}
}
//静态代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test01 {
public static void main(String[] args) {
ISinger singer=new Xiaomei();
//jdk动态代理(类加载器,动态字节数组,处理代理实例方法调用)
ISinger Jingjiren=(ISinger) Proxy.newProxyInstance(singer.getClass().getClassLoader(), singer.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("做个自我介绍");
Object obj=method.invoke(singer,args);
return obj;
}
});
Jingjiren.singer();
Jingjiren.dance(6);
}
}
运行结果:
动态代理(第三方库-cglib):
代码示例:
public interface ISinger {
public void singer();
}
public class ZhouJieLun implements ISinger{
@Override
public void singer() {
System.out.println("----一首反方向的钟送给大家----");
}
}
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;
public class Test02 {
public static void main(String[] args) {
ISinger singer=new ZhouJieLun();
//第三方库的动态代理
ISinger Jingjiren=(ISinger) Enhancer.create(singer.getClass(), singer.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println("-------自我介绍-------");
Object obj=method.invoke(singer,objects);
return obj;
}
});
Jingjiren.singer();
}
}
运行结果:
静态代理(代码示例):
//当西门庆想找潘金莲,但是他不能直接找,那么需要找个中间代理,
当西门庆调中间代理时便调到了潘金莲
//接口
public interface IWomen {
public void makeEyeWithMan();
}
public class PanjinglianImpl implements IWomen{
@Override
public void makeEyeWithMan() {
System.out.println("回眸一笑,抛个媚眼~");
}
}
public class WangPoImpl implements IWomen{
//被代理对象
IWomen woman;
public WangPoImpl(IWomen woman) {
this.woman = woman;
}
@Override
public void makeEyeWithMan() {
System.out.println("镇一壶酒,搞搞气氛~");
woman.makeEyeWithMan();
}
}
public class XiMenQing {
public static void main(String[] args) {
//创建被代理对象
PanjinglianImpl panjinglian=new PanjinglianImpl();
//创建代理
WangPoImpl wangPo=new WangPoImpl(panjinglian);
wangPo.makeEyeWithMan();
}
}
运行结果: