1.描述
为其他对象提供一种代理以控制对这个对象的访问。
2.模式的使用
·抽象主题(Subject):抽象主题是一个接口,该接口是对象和他的代理所共用的接口,即是RealSubject和Proxy实例所实现的接口。
·实际主题(RealSubject):实际主题是实现抽象主题接口的类。实际主题的实例是代理角色(Proxy)实例所代理的对象。
·代理(Proxy):代理是实现抽象主题接口的类(代理和实际主题实现了相同的接口)。代理含有主题接口声明的变量,该变量用来存放RealSubject的实例引用,这样,代理的实例就可以控制对他所包含的RealSubject的实例访问,即可以控制对他所代理的对象的访问。
3.使用情景
·程序不希望用户直接访问该对象,而是提供一个特殊的对象以控制当前对象的访问。
·如果一个对象(例如很大的图像)需要很长时间才能加载完。
·如果对象位于远程主机,需要为用户提供访问该远程对象的能力。
4.优点
·代理模式可以屏蔽用户真正请求的对象,使用户程序和真正的对象之间解耦。
·使用代理来担当那些创建耗时的对象的替身。
5.UML图
没有
6案例
1 package 代理模式; 2 3 public class test1 { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 8 } 9 10 } 11 12 /* 13 * 抽象主题 14 */ 15 interface Geometry{ 16 public double getArea(); 17 } 18 19 /* 20 * 具体模板 21 */ 22 class Triangle implements Geometry{ 23 double sideA, sideB, sideC; 24 Triangle(double sideA, double sideB, double sideC){ 25 this.sideA = sideA; 26 this.sideB = sideB; 27 this.sideC = sideC; 28 } 29 public double getArea() { 30 double p = (sideA + sideB+ sideC)/2; 31 return Math.sqrt(p * (p - sideA) * (p - sideB) * (p - sideC)); 32 } 33 34 } 35 36 /* 37 * 代理 38 */ 39 class TriangleProxy implements Geometry{ 40 double sideA, sideB, sideC; 41 Triangle triangle; 42 public void setSides(double sideA, double sideB, double sideC){ 43 this.sideA = sideA; 44 this.sideB = sideB; 45 this.sideC = sideC; 46 } 47 public double getArea() { 48 if(sideA + sideB > sideC && sideA +sideC > sideB){ 49 triangle = new Triangle(sideA, sideB, sideC); //让所代理的对象调用getArea()方法 50 return triangle.getArea(); 51 } 52 else 53 return -1; 54 } 55 56 }
有空补充自动代理