Appearance
代理和本体接口的一致性
如果有一天我们不再需要预加载,那么就不再需要代理对象,可以选择直接请求本体。其中关键是 代理对象和本体都对外提供了 setSrc 方法,在客户看来,代理对象和本体是一致的,代理接手请 求的过程对于用户来说是透明的,用户并不清楚代理和本体的区别,这样做有两个好处。
用户可以放心地请求代理,他只关心是否能得到想要的结果。
在任何使用本体的地方都可以替换成使用代理。
在 Java 等语言中,代理和本体都需要显式地实现同一个接口,一方面接口保证了它们会拥有同样 的方法,另一方面,面向接口编程迎合依赖倒置原则,通过接口进行向上转型,从而避开编译器的 类型检查,代理和本体将来可以被替换使用。在 JavaScript 这种动态类型语言中,我们有时通过 鸭子类型来检测代理和本体是否都实现了 setSrc 方法,另外大多数时候甚至干脆不做检测,全部 依赖程序员的自觉性,这对于程序的健壮性是有影响的。不过对于一门快速开发的脚本语言,这些 影响还是在可以接受的范围内,而且我们也习惯了没有接口的世界。另外值得一提的是,如果代理 对象和本体对象都为一个函数(函数也是对象),函数必然都能被执行,则可以认为它们也具有一致 的“接口”,代码如下:
javascript
const myImage = (function () {
const imgNode = document.createElement('img')
document.body.appendChild(imgNode)
return function (src) {
imgNode.src = src
}
})()
const proxyImage = (function () {
const img = new Image()
img.addEventListener('load', (e) => {
myImage.setSrc(e.target.src)
})
return function (src) {
myImage('./loading.gif')
img.src = src
}
})()
proxyImage.setSrc('https://avatars.githubusercontent.com/u/84729241?v=4')