静态代理
public class StaticProxy {
public static void main(String[] args) {
WeddingCompany weddingCompany = new WeddingCompany(new You());
//WeddingCompany传入了一个目标对象You,没有通过You来直接调用方法
//而是通过weddingcompany对象来调用的
weddingCompany.marry();
System.out.println("----------------------");
/* new Thread(new Runnable() {
@Override
public void run() {
System.out.println("111");
}
}).start();*/
new Thread(()-> System.out.println("我爱你")).start();//Thread类实现了Runnable接口,它代理了实现了Runnable接口的类,然后调用代理方法
new WeddingCompany(new You()).marry();
}
}
//真实对象You和代理对象WeddingCompany都要实现同一个接口(Marry)
//代理对象要代理真实角色,
//一个实现类调用同接口下另一个实现类的方法,目的是在不改变原来代码的基础上增强代码,即通过婚庆公司调用marry可以在本来You的重写的marry方法之前之后做一些其他事情
//代理对象可以代理很多真实对象做不了的事情,真实对象专注于自己的事情
interface Marry{
void marry();
}
//真实角色
class You implements Marry{
@Override
public void marry() {
System.out.println("我结婚了");
}
}
//代理角色
class WeddingCompany implements Marry{
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void marry() {
before();
this.target.marry(); //传入的真实对象调用了结婚
after();
}
private void after() {
System.out.println("生孩子");
}
private void before() {
System.out.println("谈恋爱");
}
}
Java中的静态代理要求 代理类 委托类 都实现同一个接口
将委托类作为一个参数传入代理类中,在代理类中重写的函数中就可以在 调用委托类的重写的函数 的前后做一些操作,丰富了操作
包括实现Runnable接口也是一样的道理,Thread是代理类,实现Runnable接口的类是委托类,将实现Runnable接口的类传入到Thread类中,实现了静态代理
/* new Thread(new Runnable() {
@Override
public void run() {
System.out.println("111");
}
}).start();*/
//Lambda表达式简化后如下
new Thread(()-> System.out.println("我爱你")).start();//Thread类实现了Runnable接口,它代理了实现了Runnable接口的类,然后调用代理方法
new WeddingCompany(new You()).marry();
线程体(也就是我们要执行的具体任务)实现了Runnable接口和run方法。同时Thread类也实现了Runnable接口。此时,线程体就相当于目标角色,Thread就相当于代理角色。当程序调用了Thread的start()方法后,Thread的run()方法会在某个特定的时候被调用。thread.run()方法:
public void run() {
if (target != null) {
target.run();
}
}
实际上是执行了线程体的代码。