多线程(静态代理模式(实现Runnable接口来创建线程))
- 真实对象和代理对象都要实现同一个接口
- 代理对象去代理真实对象做事
- 好处:代理对象可以做真实对象做不了的事
真实对象专注于自己的事情
例子:我们前面学习的实现Runnable接口来创建线程的方式就用了代理模式(主线程内的创建时候)也就是
Thread(race,“兔子”).start。
这里面Thread(里面实现了Runnable接口)和这个race都实现了这个Runnable这个接口。所以Thread就是这个代理,里面的这个race就是目标对象(他在专注于他的重写run方法里面,他是无法.start开启线程的)所以就用Thread这个代理去.start()开启线程。
结婚实例:
我们这里来理一下思路:
- 这里的You和Wed类都实现了Marry这个接口。接口里面有一个抽象方法HappyMarry。You为真实对象,Wed为代理对象(他的里面要传入一个真实对象这里就是那个target(构造方法给他传参))Wed里面就完成了You很多没有的方法。
package org.example;
import sun.rmi.runtime.NewThreadAction;
public class StaticProxy {
public static void main(String[] args) {
You you = new You();
// new Thread(new Runnable(){
// @Override
// public void run() {
// }
// }).start();
//这里的Lambda表达式省略了中间的那个Runnable
new Thread(()->System.out.println("我爱你")).start();
//与上面比较是不是很相近
new WeddingCompany(new You()).happyMarry();
// WeddingCompany weddingCompany = new WeddingCompany(you);
// weddingCompany.happyMarry();
}
}
//共同实现的接口
interface Marry{
void happyMarry();
}
//真实对象,你去结婚
class You implements Marry{
@Override
public void happyMarry() {
System.out.println("You准备结婚了");
}
}
//代理对象,帮助你结婚
class WeddingCompany implements Marry{
private Marry target;//真实对象
public WeddingCompany(Marry target){//构造函数传参
this.target=target;
}
@Override
public void happyMarry() {
before();
this.target.happyMarry();
after();
}
private void before() {
System.out.println("收定金,准备婚礼现场");
}
private void after() {
System.out.println("收尾款,完成婚礼");
}
}