本文共 2452 字,大约阅读时间需要 8 分钟。
我们在学习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,所以线程的这种实现方法就是一个标准的静态代理模式。转载地址:http://kaiwi.baihongyu.com/