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