代理模式
为其他对象提供一种代理以控制对这个对象的访问。
在一些情况下客户不想或者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。
什么时候要使用代理模式呢?
在对已有的方法进行使用的时候出现需要对原有方法进行改进或者修改,这时候有两种改进选择: 修改原有方法来适应现在的使用方式, 或者使用一个‘第三者’方法来调用原有的方法并且对方法产生的结果进行一定的控制。
第一种方法是明显违背了‘对扩展开放、对修改关闭’(开闭原则),而且在原来方法中作修改可能使得原来类的功能变得模糊和多元化, 而使用第二种方式可以将功能划分的更加清晰,有助于后面的维护。所以在一定程度上第二种方式是一个比较好的选择! 当然,话又说回来了,如果是一个很小的系统,功能也不是很繁杂,那么使用代理模式可能就显得臃肿,不如第一种方式来的快捷。
代理模式的角色
抽象角色(Subject):声明真实对象和代理对象的共同接口;
真实角色(ProxySubject):代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
代理角色(RealSubject):代理角色所代表的真实对象,是我们最终要引用的对象。
示例:
abstract public class Subject { abstract public void request(); }
public class RealSubject { public RealSubject() { } public void request() { System.out.println("From real subject."); } }
public class ProxySubject extends Subject { private RealSubject realSubject; //以真实角色作为代理角色的属性 public ProxySubject() { } public void request() //该方法封装了真实对象的request方法 { preRequest(); if (realSubject == null) { realSubject = new RealSubject(); } realSubject.request(); //此处执行真实对象的request方法 postRequest(); } private void preRequest() {//something you want to do before requesting } private void postRequest() {//something you want to do after requesting } }
public class MainTest { public static void main(String[] args) { Subject sub = new ProxySubject(); sub.request(); } }
参考:大话设计模式:面向对象程序设计23种常见设计模式通俗演义 11