UML类图

图片说明

初步理解

当我们去找女朋友时,不是直接找,而是找相亲中介,相亲中介会拿的对方的的信息给我们,和我们亲手去要联系方式获取信息不同,实际上是从代理手上取得,实际效果是一样的,因为信息都获取到了(不管渠道)。:有了信息也不一定有女票。

代码及理解

底层接口

public interface Image {
    void display();
}

接口实现类

public class RealImage implements Image {

    private String fileName;
    //构造函数,给属性赋值,并进行加载动作
    public RealImage(String fileName){
        this.fileName = fileName;
        loadFromDisk(fileName);
    }

    @Override
    public void display() {
        System.out.println("Result:您已获得: " + fileName);
    }

    private void loadFromDisk(String fileName){
        System.out.println("柜台正在出票 " + fileName);
    }
}

代理类

此时,我们不想通过柜台买票,而是想上网找代理商买。而显然,代理商也会去柜台买票,而不是直接卖给我们。

public class ProxyImage implements Image{

    private RealImage realImage;
    private String fileName;

    public ProxyImage(String fileName){
        this.fileName = fileName;
    }

    @Override
    public void display() {
        if(realImage == null){
            realImage = new RealImage(fileName);
        }
        System.out.println("Loading:代理商正在帮你买票 " + fileName);
        realImage.display();
    }
}

测试主方法

public class Demo {

    public static void main(String[] args) {
        Image image = new ProxyImage("火车票.jpg");

        // 首先需要在柜台买到票才能代理
        image.display();
        System.out.println("");
        // 得到了12306的授权,不需要再去柜台买了,可以直接卖票
        image.display();
    }
}

运行结果

柜台正在出票 火车票.jpg
Loading:代理商正在帮你买票 火车票.jpg
Result:您已获得: 火车票.jpg

Loading:代理商正在帮你买票 火车票.jpg
Result:您已获得: 火车票.jpg

总结

  • 可以看到,在使用代理商买票时,他会去找一次柜台,获得授权,之后就不会再去获取授权资格,而是可以一直卖票了。
  • 静态代理类只能为特定的接口服务。如想要为多个接口服务则需要建立很多个代理类。上面的就是一个静态代理的示例。
  • 当程序开发中产生许多的代理类时,我们就会想办法可以通过一个代理类完成全部的代理功能,那么我们就需要用动态代理。也就是通过发射机制,了解到我们具体应该找哪个类。也可以理解成,我们想要买票和住旅馆,我们只需要找到总代理,告诉他需求,他就可以帮我们解决问题。