由于一个对象不能直接引用另一个对象,所以需要通过代理对象在这两个对象之间起到中介作用。
跨域问题应该是使用代理模式解决的一个最典型的问题。由于用户模块上传的照片量越来越大,导致服务器需要将上传模块重新部署到另外一个域中,这就导致了跨域问题。我们可以将相册页面和上传模块所在的服务器抽象成两个对象,想让跨域两端的对象之间实现通信,就需要找个代理对象来实现他们之间的通信。
代理对象有很多种,简单一点的如img之类的标签通过src可以向其他域下的服务器发送请求,不过这类请求是get请求,是单向的,不会有响应数据,另外一种代理对象的形式是通过script标签。而我们需要的代理对象,是对页面与浏览器间通信的,JSONP就实现了一种代理模式。我们知道src属性可以实现get请求,因此可以在src指向的url地址上添加一些字段信息,服务器获取这些字段信息,相应生成内容。
// 前端浏览器页面 <script type="text/javascript"> // 回调函数 function jsonpCallBack(res,req) { console.log(res,req); } </script> <script type="text/javascript" src="http://localhost/test/jsonp.php?callback=jsonp CallBack&data=getJsonPData"></script>
// 另一个域下的服务器请求接口 <?php /* 后端获取请求字段数据,并生成返回内容 */ $data = $_GET["data"]; $callback = $_GET["callback"]; echo $callback."('success', '".$data."')"; ?>
这种方式可以想象成合理的一只小船,通过小船将你的请求发送给对岸,然后对岸的人们将数据放在小船里为你带回来。
通过代理可以先加载预览图片然后再加载开销大的图片,它可以解决系统之间耦合度以及系统资源开销大的问题,通过代理对象可以保护被代理对象,使被代理对象不受外界的影响。