代理模式
代理模式顾名思义就是存在一个“代理者”去代替真正的对象去执行相应的操作,并且可以在操作前后进行增强操作。现实生活中,明星往往都会有一个经纪人,所有的行程安排都由经纪人处理。下面我们通过代码来描述这种场景。
代理模式中主要存在三种角色:
- Subject:抽象对象,声明真实对象和代理对象的公共接口
- RealSubject:真实对象,是最终被调用的对象,即上文提到的明星
- Proxy:代理对象,会对外暴露,内部有真实对象的引用,即上文提到的经纪人
首先,我们先声明一下抽象对象,模拟明星参加活动的场景,会有一个参加活动的抽象方法。
public interface ISubject { void participateActivity(); }
模拟明星参加活动的代码:
public class RealSubject implements ISubject { @Override public void participateActivity() { System.out.println("明星本人参加活动"); } }
模拟经纪人的代理代码:
public class ProxySubject implements ISubject { RealSubject star = new RealSubject(); @Override public void participateActivity() { System.out.println("经纪人收到了活动邀请,通知明星本人"); // 此处调用真实对象去执行对应的方法;在之前可以去进行方法的增强 star.participateActivity(); } }
最终客户端,只需要访问代理对象即可。
public class Client { public static void main(String[] args) { ProxySubject proxySubject = new ProxySubject(); proxySubject.participateActivity(); } }
使用场景
此时我们例子比较简单,下面说一下代理模式的一些场景。以下两种场景会比较试用于代理模式:
- 直接访问对象复杂。比如上游需要访问多次才能获取到想要的内容,此时就可以提供一个代理对象给上游,上游只需访问一次即可。虽然不能省去代理对象的复杂度,但是省去了上游调用的复杂度。
- 需要对访问的内容进行增强。例如上文中,我们在调用真实对象之前,可以做一些方法增强。在Spring中的AOP就是采用的代理模式的思想。
优缺点
优点
- 职责分明,高扩展性
- 可以对方法进行增强处理
缺点:
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢