7.1、Java多线程——静态代理模式
什么是静态代理?
先说说我的理解,静态代理分为四个部分
真实角色、真实角色要做的事情、代理角色、以及最终做了什么
举个简单的例子,假设 我现在要结婚了 这件事情中 我就是真实角色,要做的事情就是结婚。而婚庆公司就是代理角色,他需要在我结婚之前在婚礼现场做一些布置,在结婚之后要问我结尾款,那么最终做了三件事分别是 布置现场、结婚、问我结尾款。
那我们现在用代码来实现一下静态代理,代码如下所示:
package com.hkl.demo02;
public class StaticProxy {
public static void main(String[] args) {
WeddingProxy weddingProxy = new WeddingProxy(new You());
weddingProxy.HappyMarry();
//也可以一句话完成如下
new WeddingProxy(new You()).HappyMarry();
}
}
interface Marry {
//结婚
void HappyMarry();
}
//真实角色
class You implements Marry {
//要去结婚了
public void HappyMarry() {
System.out.println("结婚的日子到了!!!");
}
}
//婚庆公司代理 布置结婚现场
class WeddingProxy implements Marry {
private Marry target;
public WeddingProxy(Marry target) {
this.target = target;
}
//婚庆公司代理
public void HappyMarry() {
before();
this.target.HappyMarry();
after();
}
private void before() {
System.out.println("结婚之前布置现场");
}
private void after() {
System.out.println("结婚之后收尾款");
}
}
在代码中可以看到,真实角色 和 代理角色 都必须要继承 Marry 这个接口,代理角色要代理真实角色 在真实角色要做的事情的前后 代理角色可以去完成额外要做的其他的事情。
这样的好处就是代理角色可以做很多真实角色做不了的事情,而真实角色只需要专注做好自己的事情即可
其实我们可以对比一下 静态代理模式 和 多线程Runable接口创建线程 的方式很相似,来看看代码如下:
//先来看看Thread 的方式如下:
new Thread(传入自定义线程对象).start();
//再来对一下咱们静态代理模式如下:
new WeddingProxy(new You()).HappyMarry();
不难看出 线程的创建 底层原理其实就是静态代理,都是先new一个代理类然后将真实角色对象传入代理类对象中,再调用其执行方法。真实角色就专注做好自己的事情,其他的交给代理类去处理就好
我理解的就是:我们自定义的线程类专注做好run方法里定义的事情,然后其他的东西交给 Thread 代理类去处理就好