设计模式之代理模式(动态代理)
具体代码实现:和静态代理方式一样,我们创建了一个接口:
public interface ICompany { public void signContract(String companyName); }
这个接口将由真正的实现类Company来实现:
public class Company implements ICompany { @Override public void signContract(String companyName) { // TODO Auto-generated method stub System.out.println("我们签约了"+companyName); } }
上面提到每一个动态代理对象都要关联到一个handler,而这handler就是InvocationHandler的实现类:
public class ProxyCompanyHandler implements InvocationHandler { private ICompany company; public ProxyCompanyHandler(ICompany company){ this.company = company; } @Override public Object invoke(Object proxy, Method method, Object[] arg2) throws Throwable { // TODO Auto-generated method stub //从侧面切入从而达到扩展的效果的编程,就是面向切面编程(AOP Aspect Oriented Programming)。 //AOP并不是新技术,而是相对于面向对象编程的一种新的编程思想。在日志,事务,权限等方面使用较多 if(method.getName().equals("signContract")){ System.out.println("这里我们可以拦截方法的执行,我可以动态代理这个对象"); method.invoke(company, arg2); } return method.invoke(company, arg2); } } }
如何创建一个动态代理的实例呢,通过Proxy.newProxyInstance方法创建一个动态代理的实例。
public class ProxyMain { public static void main(String[] args) { ICompany tencent = new Company(); ProxyCompanyHandler handler = new ProxyCompanyHandler(tencent); ICompany tencentProxy = (ICompany) Proxy.newProxyInstance(tencent.getClass().getClassLoader(),tencent.getClass().getInterfaces(), handler); //此处便实现了对 Company的动态代理。并且生成了代理对象 tencentProxy。如果配合java反射的思想。可以实现很多有意思的代理 tencentProxy.signContract("阿里巴巴"); } }
最终执行结果为:
其实:如果配合java反射更是可以在代理某些私有对象。比如在android中可以通过代理,拦截android,activity的启动。通过【欺上瞒下】的手段更是可以启动没有在清单中注册的activity。这也是插件化框架的重要思想。总而言之,动态代理在一些优秀的框架中已经得到广泛的使用。这种设计模式,也给我们实现某些功能带来极大的便利性。
下一篇:
两种java中的占位符的使用