代理模式
介绍
- 使用者无权访问目标对象;
- 中间加代理,通过代理做授权和控制;
设计原则验证
- 代理类和目标类分离,隔离开目标类和使用者
- 符合开放封闭原则
示例
- 科学上网,访问 github.com;
- 明星经纪人;
class ReadImg {
constructor(fileName){
this.fileName = fileName;
this.loadFromDisk(); // 初始化即从硬盘中加载,模拟
}
display(){
console.log("diaplay..." + this.fileName);
}
loadFromDisk(){
console.log("loading..." + this.fileName);
}
}
class ProxyImg {
constructor(fileName) {
console.log('测试', fileName)
this.realImg = new ReadImg(fileName);
}
display() {
this.realImg.display();
}
}
// 测试
let proxyImg = new ProxyImg("1.png");
proxyImg.display();
场景
- 网页事件代理
- jQuery $.proxy
- ES6 Proxy
// 明星 let star = { name: '*爽', age: 666, phone: "12354685792" } // 经纪人 let agent = new Proxy(star, { get: function(target, key){ if(key === 'phone') { // 返回经纪人手机号 return "65656565956" } if(key === 'price') { // 明星不报价,经纪人报价 return 3080000; } return target[key]; }, set: function(target, key, val) { if(key === 'customPrice'){ if(val < 2080000){ // 最低 208万/日 throw new Error('价格太低') } else { target[key] = val return true; } } } }) // 测试 console.log(agent.name) console.log(agent.age) console.log(agent.phone) console.log(agent.price) agent.customPrice = 10000000; console.log(agent.customPrice)
对比
代理模式VS适配器模式
适配器模式:提供一个不同的接口(如不同版本的插头)
代理模式:提供一摸一样的接口
代理模式VS装饰器模式
装饰器模式:扩展模式,原有功能不变且可直接使用
代理模式:显示原有功能,但是经过限制或者阉割之后