什么是静态代理模式?

不言而喻,就是某个东西代理另外一个东西去做某些事情,在Java中,抽象成为对象来看,就是一个对象A代理对象B去实现一些事情,好让对象B专注于做自己的事情。

静态代理的实现

举个例子:你要结婚,可以叫婚庆公司来帮你做一些事情,比如布置现场,主持婚礼等等,好让专注于结婚这件事,不去操心其他的事情,这也就是婚庆公司代理了去做了事情。
在Java中怎么实现,如下:

public class TestStaticProxy {
    public static void main(String[] args) {
        You you = new You();
        WeddingCompany weddingCompany = new WeddingCompany(you);
        weddingCompany.HappyMarry();
    }

}

//结婚接口
interface Marry{
    void HappyMarry();
}

//实体对象(被代理对象):你
class You implements Marry {

    @Override
    public void HappyMarry() {
        System.out.println("我结婚啦,超开心!");
    }
}

//代理对象:婚庆公司
class WeddingCompany implements Marry{

    private Marry target;//婚庆公司要代理的目标对象

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

    //婚庆公司代理你结婚这件事情
    @Override
    public void HappyMarry() {
        before();
        target.HappyMarry();
        after();
    }

    //这就是代理对象做的事。
    void before(){
        System.out.println("结婚前,布置一下婚礼现场!");
    }

    void after(){
        System.out.println("结婚后,开始收尾款啦!");
    }
}

运行结果:
image.png

Thread也是这种方式实现的

Java代码如下:

public class TestStaticProxy {
    public static void main(String[] args) {
        You you = new You();
        WeddingCompany weddingCompany = new WeddingCompany(you);
        weddingCompany.HappyMarry();

        Runnable runnable = new Runnable() {//这里的runnale就例如you
            @Override
            public void run() {//这里的run()的实现就例如上述You中的HappyMarry()方法对于Marry接口中的HappyMarry()方法的实现
                System.out.println("我结婚啦,超开心!");
            }
        };
        Thread thread =new Thread(runnable);//这里就例如:WeddingCompany weddingCompany = new WeddingCompany(you);
        thread.start();//这里就例如:weddingCompany.HappyMarry();
    }
}

总结

  • 静态代理总结:
    1,真实的对象(you)和代理对象(weddingcompany) 都要实现同一个接口(marry)
    2,代理对象要代理真实的角色

  • 好处:
    1,代理对象可以做很多真实对象做不了的事情(before,after)
    2,真实对象只专注做自己的事情(happymarry)