静态代理模式:真实对象和代理对象都实现同一个接口,代理对象可以帮助做更多的事情,真实对象更加专注
用婚庆公司举例:你自己要结婚。婚庆公司可以帮你布置,你只需要负责结婚就行。
你是真实对象,婚庆公司是代理对象,你们两个都实现Marry
接口,接口内有一个happyMarry
的方法。婚庆公司的构造器将你作为参数,在婚庆公司的happyMarry
方法中,可以去调用你的happyMarry
方法。
import javax.swing.*;
//main
public class StaticProxy {
public static void main(String[] args) {
new marryCompany(new You("yqb")).happyMarry();
}
}
//结婚接口
interface Marry{
void happyMarry();
}
//你,真实对象,实现Marry
class You implements Marry{
private String name;
public You(String name) {
this.name = name;
}
@Override
public void happyMarry() {
System.out.println(name+ "要结婚了");
}
}
//婚庆公司,代理对象,实现Marry,且接收Marry对象
class marryCompany implements Marry{
private Marry XXX;
public marryCompany(Marry XXX) {
this.XXX = XXX;
}
@Override
public void happyMarry() {
before();
XXX.happyMarry();
after();
}
//婚前
private void after() {
System.out.println("代理:结婚后,公司收钱");
}
//婚后
private void before() {
System.out.println("代理:结婚前,公司布置");
}
}
与Thread极其相似,下面是Thread覆写run方法源码,target是Runnable对象。我们构造Thread时传入Runnable对象就会传给它。可以看到当我们调用thread的start()方法时,就会去执行run()方法,而这个方法内部又是去调用传入的Runnable对象的run()方法,与婚庆公司代理的理念一模一样。
public void run() {
if (target != null) {
target.run();
}
}