设计模式之代理模式

定义

1
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问

应用场景

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

代码解释 代理表白为别人做嫁衣

1
2
3
4
5
6
7
8
9
10
Confession 接口: 定义了 confess() 方法,这是表白的抽象行为。
RealConfessor 类: 实际表白者,实现了直接表白的行为。
ProxyConfessor 类: 代理表白者(朋友),它持有一个 RealConfessor 的引用。
在 confess() 方法中,它首先介绍自己的角色。然后调用实际表白者的 confess() 方法。最后,还会添加一些额外的信息来支持表白。
ProxyConfessionDemo 类:客户端代码,展示了如何使用代理表白。

使用特点:
控制访问:代理在实际表白前后添加了额外的行为。
增强功能:代理不仅传达了表白信息,还增加了额外的支持性言论。
隐藏实现细节:客户端不需要直接与实际表白者交互。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package Proxy;

// 表白接口
interface Confession {
void confess();
}

// 实际表白者
class RealConfessor implements Confession {
private final String name;
private final String crushName;

public String getName() {
return name;
}

public RealConfessor(String name, String crushName) {
this.name = name;
this.crushName = crushName;
}

@Override
public void confess() {
System.out.println(name + " 鼓起勇气对 " + crushName + " 说: '我喜欢你!'");
}
}

// 代理表白者(朋友)
class ProxyConfessor implements Confession {
private final RealConfessor realConfessor;
private final String proxyName;

public ProxyConfessor(String confessorName, String crushName, String proxyName) {
this.realConfessor = new RealConfessor(confessorName, crushName);
this.proxyName = proxyName;
}

@Override
public void confess() {
System.out.println(proxyName + " 作为 " + realConfessor.getName() + " 的朋友,帮忙传达消息...");
realConfessor.confess();
System.out.println(proxyName + " 补充道: '我可以证明,他/她是一个很好的人!'");
}
}

// 客户端
public class ProxyConfessionDemo {
public static void main(String[] args) {
Confession proxy = new ProxyConfessor("小明", "小红", "小李");
proxy.confess();
}
}