Fork me on GitHub

代理模式

静态代理

一个场景设定,假设你要结婚了,但你不会为了结婚就要学婚礼布置,拍婚纱照等技术活,这些可以交给婚庆公司做嘛。于是你找了婚庆公司作为你的代理为了做一些准备工作。但最后去结婚的是你而不婚庆公司。这就是代理模式了。

静态代理有三个元素:共同接口、代理对象、目标对象。

代码

接口

1
2
3
public interface Marry {
    void marry();
}

代理类,把接口当做参数传入构造函数中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MarryCompany implements Marry {
    Marry marry;

    public MarryCompany(Marry marry) {
        this.marry = marry;
    }

    void proWwork() {
        System.out.println("婚礼前准备");
    }

    void afterWwork() {
        System.out.println("婚礼后收拾");
    }

    @Override
    public void marry() {
        proWwork();
        marry.marry();
        afterWwork();
    }
}

目标对象

1
2
3
4
5
public class You implements Marry{
    public void marry(){
        System.out.println("我结婚了");
    }
}

1
2
3
4
5
6
public class Test {
    public static void main(String[] args) {
        Marry marry=new MarryCompany(new You());
        marry.marry();
    }
}

问题

静态代理不实现接口也能做到,为什么还要实现共同接口?接口的作用是保证了代理对象具有和被代理对象具有一样的契约。
“代理”是针对相同的接口编程,以达到透明地替换原来的对象。如果添加一个不相干新的类去做这件事,这叫委托模式了。

静态代理总结:

优点:可以做到在不修改目标对象的功能前提下,对目标功能扩展.
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护。此时动态代理闪亮登场!

动态代理

在动态代理中我们不再需要再手动的创建代理类,我们只需要编写一个动态处理器就可以了。真正的代理对象由JDK再运行时为我们动态的来创建。
比如这次不是我结婚了,而是我的宠物猫jack和rose要举行婚礼

代码

待完善