嗨喽~小伙伴们XX好呀,
本章我们来介绍,java中出现的静态代理模式。
代理,对应于英语单词-----Proxy,从字面上理解,就是在实现代理目标(Target)所有的需求的同时,还能够实现代理目标无法做到的事情,比如为目标添加审查和监控功能,主要包括前置处理和后置处理。
读完上面这段话,小伙伴们可能有点懵,咱从网上找到了一个典型的例子,在这分享给大家,请大家从下面的例子中细细体会:
话说啊我们可爱的小明同志马上就要结婚啦,可是,许多的琐事诸如场地布置,鲜花摆放,婚礼流程等等,他自己操办不过来,于是,他找到了一家婚庆公司,由婚庆公司代替他去操办所有的琐事,而他自己,只需要专注于自己的事情就行了(比如努力工作挣足够的钱来办婚礼^_^)。这样一个浅显的例子,咱可以用一段代码描述:
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. 代理目标可以只专注于自己的事情。(比如本例子中,小明只需要考虑挣够钱来还尾款)
在这,我们扩展一点点知识,上面代码段里,有如下代码:
//婚庆公司----代理角色
Marry marryCompany = new MarryCompany(xiaoming);
//用婚庆公司的marry()方法代替小明的marry()方法
marryCompany.marry();
咱可以使用匿名的方式,将两句合为一句,用一个图来说明:
其实,之所以介绍代理方面的知识,是为了引出接下来的东西,
我们来看一看JDK里关于Thread类的一段源码:
显然,这是Thread类的某一个构造方法,细心的小伙伴们可能看到了熟悉的“target”字样!没错!!!这个构造方法便是使用了代理模式编写, 如果你已经对上面那个例子中的代码比较熟悉,那么对于下图中所表示的Java线程启动方式就有了更深刻的理解了:
(图中的NewThread实现了Runnable接口)
甚至,结合Lambda表达式,小伙伴们也能够看懂下面的代码:
new Thread( () -> System.out.println("我是易果啥笔") ).start();
如果小伙伴们没学过Lambda表达式的话,可以参考我的另一篇博文:
java是如何简化成一行代码的?-----Lambda表达式初识
代理模式也是设计模式的一种。 了解代理模式的特点,有助于我们理解一些底层原理的实现。
最后喜欢的小伙伴们点个赞鼓励支持一下吧~