java中代理模式是使用最最广泛的一个模式了
在当今最流行的hibernate和Spring中都可以看到它的广泛应用。
比如说在hibernate中的延迟加载和Spring中的AOP.都有它巨大的功劳。
它的中心思想是,为其他对象提供一种代理以控制对这个对象的访问。
有三个角色,抽象主题角色,具体实现角色,代理主题角色
- package com.gengu.代理;
- /**
- * 代理类接口
- * */
- public interface Subject {
- /**这个接口定义了所被代理的类所应该实现的方法*/
- public void doSomething();
- public void doAnyThing();
- }
具体实现角色
- package com.gengu.代理;
- public class RealSubject implements Subject{
- @Override
- public void doAnyThing() {
- System.out.println("doAnyThing");
- }
- @Override
- public void doSomething() {
- System.out.println("doSomeThing");
- }
- }
代理主题角色
- package com.gengu.代理;
- /**这是Concrete的代理类*/
- public class ProxySubject implements Subject{
- private Subject iProxy;
- public ProxySubject(Subject iProxy){
- this.iProxy = iProxy;
- }
- @Override
- public void doAnyThing() {
- before();
- this.iProxy.doAnyThing();
- after();
- }
- @Override
- public void doSomething() {
- before();
- this.iProxy.doSomething();
- after();
- }
- private void before(){
- System.out.println("调用方法前");
- }
- private void after(){
- System.out.println("调用方法后");
- }
- }
看了这个代码能很强烈的感受到面向切面编程中的思想。
它的优点是:职责清晰,高扩展性,智能化。
在Spring中的代理模式是这样的:如果一个类实现了接口那么,就会使用JVM自带的动态代理机制,如果没有实现接口,那么会使用CGLIB类实现动态代理。