Java学习——多线程之静态代理模式
我们在学习Java时知道23种设计模式是前人总结出来的比较好的模式,以供后人使用,那么23种设计模式到底是哪23种呢?主要分为3大类,如下:
1.创建型模式(共五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
2.结构型模式(共七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
3.行为型模式(共十一种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
那么今天我们就来学习代理模式里面的一种静态代理模式,有静态代理当然就有动态代理,今天我们就先来看静态代理,因为在多线程种我们需要了解到静态代理模式。
我们设想一个场景:比如说你要结婚了,那是不是要请一个婚庆公司。因为结婚这事你需要亲力亲为,但是像布置结婚现场、活跃结婚气氛、主持结婚流程、包括善后工作,作为结婚的你当然是忙的不可开交,自然不能去做这些事情了,那么你是不是就请了一个婚庆公司,让婚庆公司帮你去做这些事,代替你去做结婚的这些事情,虽然你和婚庆公司都要去做结婚这件事情,但是其实本质上来说结婚的还是你自己。下面我们来看下用代码怎么去实现:
/**
* 静态代理模式:
* 1.真实角色
* 2.代理角色
* 3.共同要实现的接口
* 注意:
* 代理对象代理真实角色去结婚,真实结婚的还是真实对象。
* 优点:
* 代理对象可以做很多真实对象做不了的事情,真实对象专心的去做自己的事情
*/
public class StaticProxy {
public static void main(String[] args) {
//结婚,让代理帮你,至于要将你作为对象交给代理对象,它就可以帮你完成结婚
//获取真实角色
You you = new You();
//获取代理角色,并将真实角色传给代理角色
WeddingCompany weddingCompany = new WeddingCompany(you);
//代理觉得帮你去结婚,实际上还是你自己去结婚的,不过结婚所附带的是就不用你去做了,你只需要专注结婚,其他的事情代理帮你做好
weddingCompany.happyMarry();
}
}
//你
class You implements Marry{
@Override
public void happyMarry() {
System.out.println("你要结婚了");
}
}
//你的代理对象:婚庆公司
class WeddingCompany implements Marry{
private You you;
public WeddingCompany(You you) {
this.you = you;
}
@Override
public void happyMarry() {
//结婚之前代理帮真实角色做的事
System.out.println("结婚之前,布置现场");
//真实角色只用专注于结婚就行了
you.happyMarry();
//结婚之后代理帮真实角色做的事
System.out.println("结婚之后,惨不忍睹");
}
}
//你们都要做的事(接口):结婚
interface Marry{
void happyMarry();
}
我们看见这个代码是不是与我们多线程种实现Runnable接口,重写run方法非常的相似呢,我们再来回顾一下第二种线程的实现方式:
/**
* 创建线程方式二:
* 1.实现Runnable接口
* 2.重写run方法
* 3.借助静态代理模式开启线程
*/
//1.实现Runnable接口
public class TestNewThread02 implements Runnable{
//2.重写run方法
@Override
public void run() {
//这里是线程体
for (int i = 0; i < 10; i++) {
System.out.println("一个新的线程");
}
}
//主线程
public static void main(String[] args) {
//3.使用静态代理模式开启线程
TestNewThread02 thread02 = new TestNewThread02();
Thread t = new Thread(thread02);
t.start();
System.out.println("main线程");
}
}
在多线程的这种实现方法中就用到了静态代理模式,其实Thread类就相当于是代理(例子里里面的婚庆公司),它代理TestNewThread02类去实现start()方法。其实Thread类也实现了Runnable,TestNewThread02类也实现了Runnnable,只是我们平时没有注意到而已,点开Thread的源码:
我们发现Thread也实现了Runnable,所以线程的这种实现方法就是一个标准的静态代理模式。