Java设计模式--代理模式

代理模式

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

Proxy Pattern

Provide a surrogate or placeholder for another object to control access to it.

类图

模式的结构与使用

代理方法模式的结构中包括三种角色。

  • 抽象主题(Subject):抽象主题是一个接口,该接口是对象和它的代理所共用的接口,即是RealSubject角色和Proxy角色实例所实现的接口。
  • 实际主题(RealSubject):实际主题是实现抽象主题接口的类。实际主题的实例是代理角色(Proxy)实例所要代理的对象。
  • 代理(Proxy):代理是实现抽象主题接口的类(代理和实际主题实现了相同的接口)。代理含有主题接口声明的变量,该变量用来存放RealSubject角色的实例引用,这样一来,代理的实例就可以控制对它所包含的RealSubject角色的实例访问,即可以控制对它所代理对象的访问。

简单的例子

Subject的接口类Geometry.java

1
2
3
4
5
package Proxy;
public interface Geometry {
public double getArea();
}

RealSubject的实现类Triangle.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package Proxy;
public class Triangle implements Geometry {
double sideA, sideB, sideC, area;
public Triangle(double sideA, double sideB, double sideC) {
this.sideA = sideA;
this.sideB = sideB;
this.sideC = sideC;
}
@Override
public double getArea() {
double p = (sideA + sideB + sideC) / 2.0;
area = Math.sqrt(p * (p - sideA) * (p - sideB) * (p - sideC));
return area;
}
}

Proxy的实现类TriangleProxy.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package Proxy;
public class TriangleProxy implements Geometry {
double sideA, sideB, sideC;
Triangle triangle;
public void setABC(double a, double b, double c) {
sideA = a;
sideB = b;
sideC = c;
}
@Override
public double getArea() {
if (sideA + sideB > sideC && sideA + sideC > sideB
&& sideB + sideC > sideA) {
triangle = new Triangle(sideA, sideB, sideC);
double area = triangle.getArea();
return area;
} else
return -1;
}
}

测试类Application.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Proxy;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.println("请输入三个数");
double a,b,c;
a = reader.nextDouble();
b = reader.nextDouble();
c = reader.nextDouble();
TriangleProxy tp = new TriangleProxy();
tp.setABC(a, b, c);
System.out.println("面积是:" + tp.getArea());
}
}

执行效果图

远程代理

先空着,有时间补

代理模式的优点

  • 使用代理模式可以让用户的代码和某个特定类的子类的代码解耦。
  • 代理方法的使用用户不必知道它所使用的对象是怎么被创建的,只需要知道该对象有哪些方法即可。

适用代理模式的情景

  • 用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。
  • 用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。

下载源码请到

MyGitHub

文章目录
  1. 1. 代理模式
  2. 2. Proxy Pattern
  3. 3. 类图
  4. 4. 模式的结构与使用
  5. 5. 简单的例子
    1. 5.1. Subject的接口类Geometry.java
    2. 5.2. RealSubject的实现类Triangle.java
    3. 5.3. Proxy的实现类TriangleProxy.java
    4. 5.4. 测试类Application.java
  6. 6. 执行效果图
  7. 7. 远程代理
  8. 8. 代理模式的优点
  9. 9. 适用代理模式的情景
  10. 10. 下载源码请到