设计模式-代理模式

代理模式

定义

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

类图

代理模式类图

Subject(主体)

定义了是Proxy和RealSubject之间具有一致性的接口。由于存在Subject,所以Client不必在意它所使用的究竟是Proxy还是RealSubject。

Proxy(代理人)

会尽量处理来自Client的请求。只有当自己不能处理时,它才会将工作交给RealSubject。Proxy只有在必要时才会生成RealSubject。Proxy实现了在Subject中定义的接口。

RealSubject(实际的主体)

“本人”RealSubject会在“代理人”Proxy无法胜任工作时出厂。它与Proxy一样,也实现了在Subject中定义的接口。

Client(请求者)

使用Proxy的角色

示例

类图

代理模式示例类图

Printer

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
public class Printer implements Printable {
private String name;
public Printer() {
heavyJob("123");
}
public Printer(String name) {
this.name = name;
heavyJob("456(" + name + ")");
}
public void setPrinterName(String name) {
this.name = name;
}
public String getPrinterName() {
return name;
}
public void print(String string) {
System.out.println("=== " + name + " ===");
System.out.println(string);
}
private void heavyJob(String msg) {
System.out.print(msg);
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.print(".");
}
System.out.println("789");
}
}

Printable

1
2
3
4
5
6
public interface Printable {
public abstract void setPrinterName(String name);
public abstract String getPrinterName();
public abstract void print(String string);
}

PrinterProxy

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
public class PrinterProxy implements Printable {
private String name;
private Printer real;
public PrinterProxy() {
}
public PrinterProxy(String name) {
this.name = name;
}
public synchronized void setPrinterName(String name) {
if (real != null) {
real.setPrinterName(name);
}
this.name = name;
}
public String getPrinterName() {
return name;
}
public void print(String string) {
realize();
real.print(string);
}
private synchronized void realize() {
if (real == null) {
real = new Printer(name);
}
}
}

Main

1
2
3
4
5
6
7
8
9
10
public class Main {
public static void main(String[] args) {
Printable p = new PrinterProxy("Alice");
System.out.println("123" + p.getPrinterName() + "4");
p.setPrinterName("Bob");
System.out.println("567" + p.getPrinterName() + "8");
p.print("Hello, world.");
}
}

0%