一、代理概念
代理在我们日常生活经常听到这个名词,比如我们想看下google我们需要找个代理服务器来帮我们一下,比如我们想买一个外国的什么东西需要在代购网站或者找朋友帮忙在外国买一下,用概念一点话来说就是通过代理对象来间接访问目标对象,这里代理对象就是我们上面代理服务器和代购网站,目标对象就是你要实现的目的;明白什么是代理我们来说下我们今天重点,代理的两种模式静态代理和动态代理,这个是怎么区别的我们谈一下,Java中都是通过编译器生成.class文件,在通过JVM读取,然后加载到内存中,生成对应的需要对象,根据代理类创建的时间分成静态和动态代理,静态的代理就是在程序运行前.class文件就存在,我们经常使用的代理模式就是静态代理,动态代理就是程序运行时动态创建,比如JDK的动态代理和CGLB代理;下面我们就针对这几种情况来详细说一下;
二、静态代理----代理模式
这里我们使用取款机这个例子来说一下,现在假如说你是招商的银行卡,你需要在工商取款机取款,这里有个规定那就是每笔需要收费2元,这个工商取款机就是代理对象,你的目标对象就是取款,我们抽象一个取款的接口WithdrawService,招商取款机上面的实现取款机接口ATM,然后工商取款机ATMProxy实现代理角色;当然这里我简化很多步骤;
/** * Created by wangt on 2017/11/2. * 抽象的取款接口 */ public interface WithdrawService { int GetByMoneyWithdraw(int money); } /** * Created by wangt on 2017/11/2. * ATM机实现的接口 */ public class ATM implements WithdrawService{ @Override public int GetByMoneyWithdraw(int money) { System.out.print("取款"+money); return money; } } /** * Created by wangt on 2017/11/2. * 代理对象 */ public class ATMProxy implements WithdrawService { private ATM atm; public ATMProxy(ATM atm){ this.atm=atm; } @Override public int GetByMoneyWithdraw(int money) { int proxyMoney=2; System.out.print("取款"+money+":"+"手续费"+proxyMoney); atm.GetByMoneyWithdraw(money+proxyMoney); return money+proxyMoney; } } /** * Created by wangt on 2017/11/2. * 测试类 */ public class ProxyTest { public static void main(String[] args){ WithdrawService withdrawService=new ATMProxy(new ATM()); withdrawService.GetByMoneyWithdraw(1000); } }