JavaScript-代理模式
使用者无权访问目标对象
中间加代理,通过代理授权和控制
传统 UML 类图
JavaScript 中的代理模式
class ReadImg { constructor(fileName) { this.fileName = fileName; this.loadFromDisk(); } display() { console.log("display..." + this.fileName); } loadFromDisk() { console.log("loading..." + this.fileName); } } class ProxyImg { constructor(fileName) { this.readImg = new ReadImg(fileName); } display() { this.readImg.display(); } } // test let proxyImg = new ProxyImg("1.png"); proxyImg.display();应用场景
网页代理事件
Documenta1 a2 a3 a4 a5jQuery
Documenta1 a2 a3 a4 a5$.proxy
Documenta1 a2 a3 a4 a5es6 Proxy
明星和经纪人的关系
// 明星 let star = { name: "张XX", age: 25, phone: "13910733521" }; // 经纪人 let agent = new Proxy(star, { get: function(target, key) { if (key === "phone") { // 返回经纪人自己的手机号 return "18611112222"; } if (key === "price") { // 明星不报价,经纪人报价 return 120000; } return target[key]; }, set: function(target, key, val) { if (key === "customPrice") { if (val < 100000) { // 最低 10w throw new Error("价格太低"); } else { target[key] = val; return true; } } } }); // 主办方 console.log(); console.log(agent.age); console.log(agent.phone); console.log(agent.price); // 想自己提供报价(砍价,或者高价争抢) agent.customPrice = 150000; // agent.customPrice = 90000 // 报错:价格太低 console.log("customPrice", agent.customPrice);设计原则验证
- 代理类和目标类分离,隔离开目标类和使用者
- 符合开放封闭原则
代理模式 VS 适配器模式
- 适配器模式:提供一个不同的接口(如不同版本的插头)
- 代理模式:提供一模一样的接口
代理模式 VS 装饰器模式
- 装饰器模式:拓展功能,原有功能不变且可直接使用
- 代理模式:显示原有功能,但经过限制或阉割之后的
代理模式(静态代理模式、动态代理模式、cgLib代理模式、拦截器)动态代理模式
设计模式之代理模式、动态代理模式、Cglib代理模式动态代理是代理模式吗
代理模式-静态代理模式 代理模式-动态代理(基于接口,JDK动态代理)动态代理是代理模式吗
【设计模式】代理模式 ( 代理模式结构 | 客户端 | 主题对象 | 被代理对象 | 代理对象 )设计模式的代理模式
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )动态代理是代理模式吗
设计模式之代理模式(包含静态代理和动态代理)设计模式的代理模式
【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )设计模式的代理模式