定义(百度百科):
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
UML类图:
具体代码:
public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); Proxy proxy = new Proxy(realSubject); proxy.request(); } } public class Proxy { Subject realSubject = null; Proxy(Subject realSubject) { this.realSubject = realSubject; } void request() { System.out.println("代理类"); realSubject.request(); } } public class RealSubject implements Subject { @Override public void request() { System.out.println("request"); } } public interface Subject { void request(); }
模块说明:
Subject抽象主题:声明真实主题和代理主题的共同接口。
RealSubject真实主题:定义代理对象需要代理的真实对象。
Proxy代理主题:代替真实对象来控制对真实对象的访问,代理对象持有真实对象的应用,从而可以随时控制客户端对真实对象的访问。
相关实例:
代理模式大家都是程序员都懂的翻墙,就是挂的代理服务器。
具体到代码层面,spring的动态代理,java原生的动态代理,cglib的动态代理等等(关于这三先挖个坑,以后来填)。
适用场景:
它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。
优缺点:
优点:
能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。
缺点:
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,例如保护代理。
实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂,例如远程代理。
总结:
代理模式实质是控制对象的访问。