package StaticProxy;

/**
 * @author 庞靖超
 * @version V1.0
 * @Package StaticProxy
 * @description 静态代理模式
 * @date 2021/8/24 15:42
 */

// 静态代理模式总结:
// 真实对象和代理对象都要实现同意接口
// 代理对象要代理真实角色

// 好处:
// 代理对象可以做很多真实对象做不了的事情
// 真实对象就专注做自己的事情

public class StaticProxy {
    public static void main(String[] args) {
        //创建真实角色,可使用接口
        Marry you = new You();
        //创建代理角色,代理角色往往要添加新的方法,不建议使用接口创建
        WeddingCompany company = new WeddingCompany(you);

        company.marry();

    }
}

//接口
interface Marry {
    void marry();
}

//真实角色
class You implements Marry {
    @Override
    public void marry() {
        System.out.println("我结婚了");
    }
}

//代理角色,需要持有真实角色的引用
class WeddingCompany implements Marry {
    private Marry you;

    public WeddingCompany(Marry you) {
        this.you = you;
    }

    @Override
    public void marry() {
        before();
        you.marry();
        after();
    }

    private void after() {
        System.out.println("结婚之后,收尾款");
    }

    private void before() {
        System.out.println("结婚之前,布置婚礼现场");
    }
}

从上面的例子可以看到,实现静态代理模式时有三个要素

    1.真实角色(委托对象)
    2.代理角色
    3.共同实现的接口
    对比以实现Runnable接口的形式创建多线程,可以发现,代理角色Thread类不需要我们创建,我们只需要写委托对象实现Runnable接口.把委托对象的引用传递给Thread,借助Thread对象来开启线程即可