什么是代理模式
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
想象一下我们生活中的购买火车票的情节,我们可以从官网上直接购买,也可以到售票的窗口购买,这是从官方购买,在编程中,这个过程就是指从提供这个功能的类直接获取这个功能。
当然了,我们也可以从售票厅旁边的小超市,或者其他地方代售火车票的地方购买火车票,那么这些代销处就是代理了火车站的售票功能,那么他们就是代理。
使用代理模式有什么好处
-
功能提供类可以更加专注于主要功能的实现
还是卖火车票的例子,当火车站的火车票都交给代理商去做的时候,他们就可以更加专注于完成生产火车票,安排车次等核心业务,当我们需要修改它核心业务的逻辑时也会更加容易。 -
代理类可以在功能提供类提供的功能上添加一下功能
代理商代理了售卖火车票的功能的时候,他们可以在顾客购买火车票的时候加入他们自己的业务,比如下个APP,抢个票,这些业务是功能提供类不会提供的业务,但是我们可以从代理商这里获得这些业务。
代理模式都有哪些
按照代理创建的时期来进行分类的话, 可以分为两种:静态代理、动态代理。
1、静态代理
静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
- 首先要实现一个主要业务的接口
package base.proxy; public interface BuyHouse { void buyHouse(); }
- 实现主要业务的逻辑
package base.proxy; public class Buy implements BuyHouse { @Override public void buyHouse() { System.out.println("i am buy a big house"); } }
- 代理主要业务
package base.proxy; public class BuyProxy implements BuyHouse { Buy buy = new Buy(); @Override public void buyHouse() { seeHouse(); buy.buyHouse(); pay(); } public void seeHouse(){ System.out.println("to see the house..."); } public void pay(){ System.out.println("pay money"); } }
- 测试
package base.proxy; public class Test { public static void main(String[] args) { BuyProxy a = new BuyProxy(); a.buyHouse(); } }
2、动态代理
动态代理是在程序运行时通过反射机制动态创建的。主要是用到了java.lang.reflect.Proxy类和InvocationHandler接口。
主要方法:
Proxy:
public static InvocationHandler getInvocationHandler(Object proxy) throws IllegalArgumentException
返回指定代理实例的调用处理程序。
InvocationHandler:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
3、CGLIB代理
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对final修饰的类进行代理。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。