代理模式的详解(一)---SpringAOP的两种实现代理模式的详细解读
现在在生活中,许多软件系统都提供跨网络和系统的应用,但在跨网络和系统应用时,作为系统开发者并不希望客户直接访问系统中的对象。其中原因很多考虑到系统安全和性能因素,因素还有很多,也就不再进行一一的列举了,所以,想到了在客户端和系统端添加一层中间层----代理层,也是即将要介绍的代理模式。
首先,明确什么是代理模式,代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,其实用最简单的方式来解释代理模式,那就是中介,客户不想直接引用对象,这个“中介”也就是代理对象就起到了一定的作用。
其次,就是代理模式的作用,就是在客户端和目标对象之间起到一个中介的作用。
来张图就比较清晰了
其中,代理模式会涉及到一些角色,
抽象角色,声明真实的对象和代理对象的共同的接口。
代理角色:代理对象内部含有真实对象的引用,也就是说,代理对象可以操作真实的对象,于此同时,代理对象会提供和真实对象相同的接口,以便再任何时刻都能代替真实对象,同时,代理对象可以在执行真实对象操作的时候,附加上其它的操作,也就是对真实对象的一个简单的封装。
真实角色:代理角色所要代表的角色,也就是我们最终想要引用的对象。
//抽象角色 public abstract class Subject { abstract public void request(); }
//真实角色 public class RealSubject extends Subject { @Override public void request() { // TODO Auto-generated method stub System.out.println("From Real Proxy"); } public RealSubject(){ } }
//代理对象 public class ProxySubject extends Subject{ private RealSubject realSubject; //用真实角色作为代理角色的属性 public ProxySubject() { } @Override public void request() { //这个方法封装了真实对象的request方法 preRequest(); if (realSubject == null) { realSubject = new RealSubject(); } realSubject.request();//此处执行真实对象的request方法 postRequest(); } private void postRequest() { // TODO Auto-generated method stub } private void preRequest() { // TODO Auto-generated method stub } }