先给出一个情景:A通过B追C

我们要考虑的

  • B为A做代理,C不应知晓A的存在

代理模式UML图

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

针对模式原型的代码实现

请求抽象接口

1
2
3
public interface Subject {
public void request();
}

具体请求对象

1
2
3
4
5
6
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("真实的请求");
}
}

代理类

1
2
3
4
5
6
7
8
9
10
public class Proxy implements Subject {
RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
}
}

客户端

1
2
3
4
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}

针对情景的代码实现

送礼物抽象接口

1
2
3
4
5
public interface GiveGift {
void giveDolls();
void giveFlower();
void giveChocolate();
}

追求类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Pursuit implements GiveGift {
String girl;

public Pursuit(String girl) {
this.girl = girl;
}
@Override
public void giveDolls() {
System.out.println(girl + ",送你洋娃娃");
}

@Override
public void giveFlower() {
System.out.println(girl + ",送你花花");
}

@Override
public void giveChocolate() {
System.out.println(girl + ",送你巧克力");
}
}

代理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Proxy implements GiveGift {
private Pursuit gg;
private String girl;

public Proxy(String girl) {
this.girl = girl;
this.gg = new Pursuit(girl);
}

@Override
public void giveDolls() {
gg.giveDolls();
}

@Override
public void giveFlower() {
gg.giveFlower();
}

@Override
public void giveChocolate() {
gg.giveChocolate();
}
}

客户端

1
2
3
4
5
6
public static void main(String[] args) {
String girl = "xyy";
Proxy_Persue.Proxy a = new Proxy_Persue.Proxy(girl);
a.giveChocolate();
a.giveChocolate();
}

代理模式的应用

  1. 远程代理
    为一个对象在不同地址空间提供局部代表,隐藏对象存在于不同地址空间的事实
  2. 虚拟代理
    根据需要创建开销很大的对象。通过来存放是俩话需要很长时间的真实对象
  3. 安全代理
    控制真实对象访问权限。
  4. 智能指引
    当调用真实对象时,代理处理另外一些事

本文部分内容改编于程杰老师的《大话设计模式》