代理模式(Proxy)

什么是代理模式

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。

想象一下我们生活中的购买火车票的情节,我们可以从官网上直接购买,也可以到售票的窗口购买,这是从官方购买,在编程中,这个过程就是指从提供这个功能的类直接获取这个功能。

当然了,我们也可以从售票厅旁边的小超市,或者其他地方代售火车票的地方购买火车票,那么这些代销处就是代理了火车站的售票功能,那么他们就是代理。

使用代理模式有什么好处

  1. 功能提供类可以更加专注于主要功能的实现
    还是卖火车票的例子,当火车站的火车票都交给代理商去做的时候,他们就可以更加专注于完成生产火车票,安排车次等核心业务,当我们需要修改它核心业务的逻辑时也会更加容易。

  2. 代理类可以在功能提供类提供的功能上添加一下功能
    代理商代理了售卖火车票的功能的时候,他们可以在顾客购买火车票的时候加入他们自己的业务,比如下个APP,抢个票,这些业务是功能提供类不会提供的业务,但是我们可以从代理商这里获得这些业务。

代理模式都有哪些

按照代理创建的时期来进行分类的话, 可以分为两种:静态代理、动态代理。

1、静态代理

静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。

  1. 首先要实现一个主要业务的接口
    package base.proxy;
    
    public interface BuyHouse {
    	void buyHouse();
    }
    
  2. 实现主要业务的逻辑
    package base.proxy;
    
    public class Buy implements BuyHouse {
    	@Override
    	public void buyHouse() {
        	System.out.println("i am buy a big house");
    	}
    }
    
  3. 代理主要业务
    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");
    	}
    }
    
  4. 测试
    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的基础。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值