主角介绍
- 毛xx(男主):内向程序员,暗恋班花徐xx多年
- 徐xx(女主):高冷学霸,喜欢研究设计模式
- 戴xx(女闺蜜):徐xx的铁闺蜜,精通面向对象编程
爱情故事中的设计模式 - 代理模式
第一幕:暗恋的苦恼
毛xx默默喜欢着徐xx,苦于没有勇气表白。他听说"送花"是追女生的经典套路,决定在徐xx生日这天送上一束玫瑰。
javascript
// 毛xx原始计划:直接送花
const xuxx = {
receiveFlower: function(flower) {
console.log(`徐xx收到${flower},但觉得毛xx太土,拒绝了`);
}
};
xuxx.receiveFlower("玫瑰花");
第二幕:代理出现
戴xx作为徐xx的闺蜜,看不下去毛xx的直男行为。她决定当"代理",先接收鲜花,等待最佳时机再转送给徐xx。
javascript
// 戴xx作为代理对象
const daixx = {
hometown: "和徐xx同个老家",
receiveFlower: function(flower) {
console.log(`戴xx收到${flower}`);
setTimeout(() => {
console.log("等徐xx心情好时...");
this.forwardToXu(flower);
}, 2000);
},
forwardToXu: function(flower) {
console.log(`戴xx转送${flower}给徐xx`);
xuXXProxy.receiveFlower(flower);
}
};
第三幕:动态代理
戴xx发现光靠自己还不够,要创造更多机会让两人接触。她设计了一个更智能的代理系统:
javascript
// 创建代理 proxy
const xuXXProxy = new Proxy(xuxx, {
get: function(target, property) {
if (property === 'receiveFlower') {
return function(flower) {
console.log(`代理检测到送花请求:${flower}`);
if (isGoodMood()) {
target[property](flower);
} else {
console.log("今天心情不好,暂不接收");
scheduleDelivery(flower);
}
};
}
return target[property];
}
});
function isGoodMood() {
// 判断心情...
return Math.random() > 0.5;
}
function scheduleDelivery(flower) {
setTimeout(() => {
console.log("预约时间到!");
xuXXProxy.receiveFlower(flower);
}, 3000);
}
第四幕:完美结局
通过戴xx的巧妙代理,毛xx终于成功送出鲜花,徐xx也在合适的时间收到了花,感受到了毛xx的心意。
javascript
// 使用代理后的送花流程
daixx.receiveFlower("永生花");
// 输出:
// 戴xx收到永生花
// 等徐xx心情好时...
// 代理检测到送花请求:永生花
// 徐xx收到永生花,感动地笑了
设计模式解析
- 相同接口 :戴xx实现了和徐xx相同的
receiveFlower
方法 - 控制访问:代理可以控制何时何地转交礼物
- 延迟执行 :使用
setTimeout
模拟延迟转交 - 增强功能:添加了心情判断、预约送达等功能
技术要点总结
特性 | 描述 |
---|---|
const |
声明常量,就像毛xx对徐xx坚定不移的爱 |
=== |
严格相等,就像感情中需要真诚 |
数据类型 | string, number, boolean, object(包含array,function等) |
Proxy | 强大的代理对象,能拦截各种操作 |
setTimeout | 实现延迟执行,模拟现实场景 |
这个狗血的爱情故事告诉我们:在软件开发中,就像追求女神一样,有时候我们需要一个"代理"来帮助我们更好地完成任务,处理一些额外逻辑,而不用改变原有对象。这就是代理模式的精髓!