静态代理

来源:互联网 发布:node.js哪些教程好 编辑:程序博客网 时间:2024/06/06 06:52

一、代理的概念

为某个对象提供一个代理,以控制对这个对象的访问,代理类和委托类有共同的父类或者是父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。



代理模式一般涉及到的角色有

  -抽象角色:声明真实对象和代理对象的共同接口
  -代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能替代真实对象相同的接口以便在任何时刻都能替代真实对象。同时,代理对象可以再执行真实对象操作时,附加其他的操作,相当于对象真实对象进行封装
  -真实角色:代理角色代表的真实对象,是我们最终要应用的对象

抽象角色:
public interface Subject {public void myRequest();}


真实角色:
public class RealSubject implements Subject{@Overridepublic void myRequest() {System.out.println("我的请求 方法访问了。。。。。。。");}}

代理角色:
public class ProxySubject implements Subject{private Subject sub;public ProxySubject(Subject sub){this.sub = sub;}@Overridepublic void myRequest() {this.preRequst();sub.myRequest();this.postRequst();}private void preRequst(){System.out.println("请求访问之前。。。。");}private void postRequst(){System.out.println("请求访问之后。。。。");}}

生成静态代理类工厂:
public class SubjectStaticFactory { //客户类调用此工厂方法获得代理对象。   //对客户类来说,其并不知道返回的是代理类对象还是委托类对象。public static Subject getInstance(){return new ProxySubject(new RealSubject());}}

测试类:
public class ProxyTest {public static void main(String[] args){Subject proxy = SubjectStaticFactory.getInstance();  proxy.myRequest();}}





静态代理类优缺点 
优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。 
缺点: 
1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。 
2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。 


由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。 静态代理会有这些问题,是因为代理在编译期就已经决定,如果代理发生在运行期,这些问题解决起来就比较简单,所以动态代理的存在就很有必要了

2 0