代理模式简介
定义:是一种结构型模式,需要给某对象提供一个代理以控制对该对象的访问,但是访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介
目的:其他对象提供一种代理以控制对这个对象的访问,当无法或不想直接引用某个对象或访问某个对象存在困难时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象
优点:
代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
代理对象可以扩展目标对象的功能
代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
缺点:
代理模式会造成系统设计中类的数量增加
在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢
增加了系统的复杂度
实现
角色:
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法
真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能
代码:
1 /**抽象主题**/ 2 public interface Subject { 3 public void request(); 4 5 } 6 7 /**真实主题**/ 8 public class RealSubject implements Subject{ 9 10 public void request() { 11 // TODO Auto-generated method stub 12 System.out.println("我是真实主题"); 13 } 14 15 } 16 17 /**代理主题**/ 18 public class ProxySubject implements Subject{ 19 private RealSubject realSubject; 20 21 public void request() { 22 if (realSubject == null) { 23 realSubject = new RealSubject(); 24 } 25 preRequest(); 26 realSubject.request(); 27 postRequest(); 28 } 29 30 public void preRequest() { 31 System.out.println("访问真实主题之前的预处理"); 32 } 33 34 public void postRequest() { 35 System.out.println("访问真实主题之后的后续处理"); 36 } 37 } 38 39 /**测试方法**/ 40 public class App { 41 public static void main( String[] args ){ 42 ProxySubject proxySubject = new ProxySubject(); 43 proxySubject.request(); 44 } 45 } 46 47 测试结果: 48 访问真实主题之前的预处理 49 我是真实主题 50 访问真实主题之后的后续处理