写在最前面
距离上一次写博客不知道经过多久了,有很多原因吧,家里的事占用了一部分心情,然后就是工行的破事,没完没了,最近终于脱身来做一些自己不反感的事情了,身体上累一点也觉得不那么难受
主题:代理
代理这个词在生活中出现的频率可谓不低,上网挂代理、微商代理,其实细想想和编程中的代理是一回事,就拿微商代理来说,真正的产品供货商就是你程序中的业务实体(类、接口),那些成天发朋友圈的讨厌的人就是代理,你是客户端,客户端请求时不与服务提供商直接打交道,而是通过代理。但有一点不同的是,微商代理很讨厌,而编程中的代理很讨人喜欢。当然他们都有共同点,那就是代理可以帮你做一些额外的事情。
代理模式会隐藏真实的业务主体,从而达到一种封装的效果,这也是面向对象编程的一个基本思想吧。
静态代理
首先谈一谈静态代理,静态代理是最简单的代理模式。直接上代码:
业务接口:
1 2 3
| public interface IBusiness{ public void earnMoney(); }
|
真实业务主体,实现了业务接口:
1 2 3 4 5
| public class Business implements IBusiness{ public void earnMoney(){ System.out.println("股票上涨"); } }
|
代理类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class BusinessProxy implements IBusiness{ private IBusiness ib; public BusinessProxy(IBusiness ib){ this.ib=ib; } public void earnMoney(){ buy(); ib.earnMoney(); sell(); } private void buy(){ System.out.println("低价买进"); } private void sell(){ System.out.println("高价卖出"); } }
|
程序入口:
1 2 3 4 5
| public static void main(String[] args){ IBusiness ib=new Business(); IBusiness ibp=new BusinessProxy(ib); ibp.earnMoney(); }
|
这就实现了一个最简单的代理类,实体类只是说股票要上涨,然而你无动于是,还是赚不了钱,所以需要代理类来帮你做一些买入卖出操作,这样你才能完成这个操作。
Java动态代理
使用静态代理虽然达到了上述目的,但是必须手动创建业务类,这样其实增加了耦合度,所以Java中有了动态代理。动态代理需要引用java中的Proxy类以及InvocationHandler接口。
上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface IMasterBusiness{ public void earnMoney(); } class MasterBusiness implements IMasterBusiness{ public void earnMoney(){ System.out.println("股票上涨"); } } class MasterBusinessIntercepter{ public void buy(){ System.out.println("低价买进"); } public void sell() { System.out.println("高价卖出"); } } public class MasterBusinessHander implements InvocationHandler { private Object masterBusinee; private MasterBusinessIntercepter intercepter = new MasterBusinessIntercepter(); public MasterBusinessHander(Object masterBusinee){ this.masterBusinee = masterBusinee; }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result;
if(method.getName().equals("earnMoney")){ intercepter.buy(); result = method.invoke(masterBusinee, args); intercepter.sell(); }else{ result = method.invoke(masterBusinee, args); } return result; } public static void main(String[] args) throws Exception { MasterBusinessHander handler = new MasterBusinessHander(new MasterBusiness()); IMasterBusiness target = (IMasterBusiness)Proxy.newProxyInstance(new MasterBusiness().getClass().getClassLoader(), new MasterBusiness().getClass().getInterfaces(), handler); target.earnMoney(); }
}
|
可以看出,上述动态代理将sell和buy方法剥离了出来,达到了目的,这也是Java动态代理的标准创建流程。