小小白祈祷中...

前言

本章我们来介绍,java中出现的静态代理模式。

代理,对应于英语单词-----Proxy,从字面上理解,就是在实现代理目标(Target)所有的需求的同时,还能够实现代理目标无法做到的事情,比如为目标添加审查和监控功能,主要包括前置处理和后置处理。

代理如何理解?

咱从网上找到了一个典型的例子,在这分享给大家,请大家从下面的例子中细细体会:

话说啊我们可爱的小明同志马上就要结婚啦,可是,许多的琐事诸如场地布置,鲜花摆放,婚礼流程等等,他自己操办不过来,于是,他找到了一家婚庆公司,由婚庆公司代替他去操办所有的琐事,而他自己,只需要专注于自己的事情就行了(比如努力工作挣足够的钱来办婚礼_)。

这样一个浅显的例子,咱可以用一段代码描述:

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
public class Wedding {
public static void main(String[] args) {
//小明----真实角色
Marry xiaoming = new XiaoMing();
//婚庆公司----代理角色
Marry marryCompany = new MarryCompany(xiaoming);
//用婚庆公司的marry()方法代替小明的marry()方法
marryCompany.marry();
}
}

//结婚接口
interface Marry{
void marry();
}

//小明----真实角色
class XiaoMing implements Marry{
//小明应该做的事情
@Override
public void marry() {
System.out.println("小明结婚啦~");
}
}


//婚庆公司----代理角色
class MarryCompany implements Marry{
private Marry target; //要代理的真实角色(比如小明)
public MarryCompany(Marry target){
this.target = target;
}
@Override
public void marry() {
//前置处理
before(); //代理角色不同于真实角色的新功能
//代理目标该做的事情
this.target.marry();
//后置处理
after(); //代理角色不同于真实角色的新功能
}
private void before() {
System.out.println("布置场地和鲜花~");
}
private void after() {
System.out.println("小明该付尾款了~");
}
}

这段代码使用了静态代理模式,简单说来,使用代理,有以下优点:

  1. 代理对象可以做许多代理目标做不到的事情(比如本例子中的场地布置,鲜花摆放,婚礼流程等等)

  2. 代理目标可以只专注于自己的事情。(比如本例子中,小明只需要考虑挣够钱来还尾款)

在这,我们扩展一点点知识,上面代码段里,有如下代码:

1
2
3
4
5
//婚庆公司----代理角色
Marry marryCompany = new MarryCompany(xiaoming);

//用婚庆公司的marry()方法代替小明的marry()方法
marryCompany.marry();

咱可以使用匿名的方式,将两句合为一句,用一个图来说明:

img

Thread类中的代理模式

其实,之所以介绍代理方面的知识,是为了引出接下来的东西,

我们来看一看JDK里关于Thread类的一段源码:

img显然,这是Thread类的某一个构造方法,细心的小伙伴们可能看到了熟悉的“target”字样!没错!!!这个构造方法便是使用了代理模式编写, 如果你已经对上面那个例子中的代码比较熟悉,那么对于下图中所表示的Java线程启动方式就有了更深刻的理解了:(图中的NewThread实现了Runnable接口)

img

甚至,结合Lambda表达式,小伙伴们也能够看懂下面的代码:

1
new Thread( () -> System.out.println("我是易果啥笔") ).start();

代理模式也是设计模式的一种。 了解代理模式的特点,有助于我们理解一些底层原理的实现。