Java中的静态代理实现方式
1、编写一个接口类
如:Subject
1 package com.neusoft.pattern.staticProxy; 2 3 /** 4 * <p>Title:</p> 5 * <p>Description:代理接口对象</p> 6 * <p>Copyright:Copyright (c) 2018</p> 7 * <p>Company:东软集团股份有限公司</p> 8 * CreateDate:2018/4/19 0019 下午 18:00 9 * Author:段美林[duanml@neusoft.com] 10 * Version:1.0 11 */ 12 public interface Subject { 13 14 void request(); 15 }
2、编写一个主体类,即需要被代理的实体类 RealSubject 必须实现接口 Subject
如:RealSubject
package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p>Description:需要被代理实现的主体类</p> * <p>Copyright:Copyright (c) 2018</p> * <p>Company:东软集团股份有限公司</p> * CreateDate:2018/4/19 0019 下午 18:14 * Author:段美林[duanml@neusoft.com] * Version:1.0 */ public class RealSubject implements Subject { @Override public void request() { System.out.println("real subject execute request========="); } }
3、编写一个代理类Proxy类,此类的目的是代理 RealSubject类执行相应的操作,即在 RealSubject类执行某个方法的时候,嵌入自己的其它业务逻辑
此代理类也必须 实现接口 Subject
如:Proxy
package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p>Description:代理类的实现</p> * <p>Copyright:Copyright (c) 2018</p> * <p>Company:东软集团股份有限公司</p> * CreateDate:2018/4/19 0019 下午 18:05 * Author:段美林[duanml@neusoft.com] * Version:1.0 */ public class Proxy implements Subject { private RealSubject realSubject; public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } @Override public void request() { System.out.println("代理类运行,执行:"+ "Before is invoked~~~~~~"); try { realSubject.request(); } catch (Exception e) { System.out.println("ex:"+ e.getMessage()); throw e; } finally { System.out.println("代理类运行,执行:"+ "After is invoked~~~~~~"); } } }
说明:
1、此代理Proxy类必须实现接口 Subject
2、此代理Proxy类 必须 拥有 被代理类 RealSubject 的引用,并且通过构造方法传入 代理类中
3、代理类Proxy类由于实现了接口 Subject,即实现了共同的方法request(),代理类在实现的request()方法中先编写实现自己的业务逻辑代码,Before的相关操作
然后调用主体类的 RealSubject 执行 被代理类的 原有业务逻辑代码,最后 在执行完被代理类的业务方法后,执行 自己的After相关操作
4、由此可见通过 1、2、3三步,代理类Proxy 执行了 主体被代理类的RealSubject.request()相关业务逻辑的同时,嵌入了 自己的 Before操作、After操作,而达到相应的嵌入操作
4、编写客户端访问类Client
如:Client
1 package com.neusoft.pattern.staticProxy; 2 3 /** 4 * <p>Title:</p> 5 * <p>Description:客户端的调用模拟类</p> 6 * <p>Copyright:Copyright (c) 2018</p> 7 * <p>Company:东软集团股份有限公司</p> 8 * CreateDate:2018/4/19 0019 下午 18:14 9 * Author:段美林[duanml@neusoft.com] 10 * Version:1.0 11 */ 12 public class Client { 13 14 public static void main(String[] args) { 15 16 Subject subject = new Proxy(new RealSubject()); 17 subject.request(); 18 } 19 }
直接运行 此客户端 Main方法:
控制台输入如下结果:
即 达到了预想的效果, 在执行主体类 RealSubject.request()方法业务逻辑同时,嵌入了 Before、After相关业务操作,达到了切入的目的。
上面即为JAVA中的静态代理实现方式!