23个java设计模式(十九)-- 代理模式

2016年03月24日 原创
关键词: java 设计模式
摘要 代理模式为其他对象提供一种代理以控制对这个对象的访问。

一、概述。

代理模式为其他对象提供一种代理以控制对这个对象的访问。

当用户希望和某个对象打交道,但程序可能不希望用户直接访问该对象,而是提供一个特殊的对象,这个特殊的对象被称作当前用户要访问对象的代理,程序让用户和对象的代理打交道,即让用户通过访问代理来访问想要访问的对象。

在代理模式中,代理的特点是:它与所代理的对象实现了相同的接口,也就是说代理和它所代理的对象向用户公开了相同的方法,当用户请求代理调用这样的方法时,代理可能需要验证某些信息或检查它所代理的对象是否可用,当代理确认它所代理的对象能调用相同的方法时,就把实际的方法调用委派给它所代理的对象。

代理模式是为对象提供一个代理,代理可以控制对它所代理对象的访问。

二、代理模式的结构。

代理模式包括三种角色:

  • 抽象主题(Subject):抽象主题是一个接口,该接口是对象和它的代理所公用的接口。
  • 实际主题(RealSubject):实际主题是实现抽象主题接口的类。实际主题的实例是代理角色(Proxy)实例所要代理的对象。
  • 代理(Proxy):代理是实现抽象主题接口的类。代理含有主题接口声明的变量,该变量用来存放实际主题的实例引用。

三、示例程序。

抽象主题(Subject)

Geometry.java

public interface Geometry {
	double calcArea();
}

实际主题(Concrete Subject)

Triangle.java

public class Triangle implements Geometry{
	private double a,b,c,area;
	public Triangle(double a, double b, double c) {
		this.a = a;
		this.b = b;
		this.c = c;
	}

	@Override
	public double calcArea() {
		double p = (a+b+c)/2.;
		area = Math.sqrt(p*(p-a)*(p-b)*(p-c));
		return area;
	}

}

代理(Proxy)

TriangleProxy.java

public class TriangleProxy implements Geometry{
	private double a,b,c;
	private Triangle triangle;
	
	public TriangleProxy(double a, double b, double c) {
		this.a = a;
		this.b = b;
		this.c = c;
	}

	@Override
	public double calcArea() {
		if(a+b>c&&a+c>b&&b+c>a) {
			triangle = new Triangle(a, b, c);
			return triangle.calcArea();
		} else return -1;
	}

}

测试程序

Example1Test.java

public class Example1Test {
	@Test
	public void testMain() {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入三个数,每输入一个数请输入回车");
		double a = -1, b = -1, c = -1;
		a = scanner.nextDouble();
		b = scanner.nextDouble();
		c = scanner.nextDouble();
		Geometry triangle = new TriangleProxy(a, b, c);
		double area = triangle.calcArea();
		System.out.println("面积是:"+area);
	}
}

四、代理模式的优点。

  1. 代理模式可以屏蔽用户真正请求的对象,使用户程序和真正的对象之间解耦。
  2. 使用代理来担当哪些创建耗时的对象的替身。

五、适合代理模式的情景。

  1. 程序可能不希望用户直接访问该对象,而是提供一个特殊的对象以控制对当前对象的访问。
  2. 如果一个对象(例如很大的图像)需要很长时间才能加载完成。
  3. 如果对象位于远程主机上,需要为用户提供访问该远程对象的能力。