从前有一位程序员叫小胡,他喜欢他的同学--小游
js
const xh={
name:"小胡",
isBald:true,
goddess:"小游"
hometown:"jx",
}
小游是班上的女神,追求者众多
js
const xy={
name:"小游",
age:21,
hometown:"jx"
}
如上述可知,小游是小胡的女神,那么小胡应该如何追到小游嘞? 小胡想到了一个点子!女生都喜欢花嘛,那我给小游送束花吧!
js
const xh={
name:"小胡",
age:21,
hometown:"jx",
isBald:true,
goddess:"小游",
sendFlower:function(sender){
console.log(`${this.name}送花给${sender.name}`)//
sender.receiveFlower(this)
}
}
小游似乎心情不好,不打算给小胡机会。
js
const xy={
name:"小游",
age:21,
hometown:"jx",
receiveFlower:function(){
console.log("本宫没心情,打出去")
}
}
以上都是我们的两位主角的信息,和他们的行为,也就是我们本次的两个对象。 他们的行为和信息也就对应到了我们对象的构成,也即 对象=属性+方法
这可难倒了了小胡,可是,小胡应该如何才能追求到女神呢?他想起了学习js时看到的代理模式
代理模式
代理模式就是使用相应的方法就是指代理对象拥有和真实对象一样的功能,并且能够通过代理对象完成和真实对象一样的相应的功能。
简而言之呢,小胡同学应该找一个"代理商"帮他试试看能不能帮他送送花给小游同学,说不定小游就因此同意了他的表白。所以小胡同学成功找到了小游同学的好闺蜜:小美同学,帮助他表白小游同学。
那么小胡为什么会选择代理模式的方法追求小游呢?
代理模式的优点
1. 保护目标对象
可以使得目标对象不会泄露自己的细节(属性与方法),提高整个系统的安全性。
也就是说,如果小游因为害羞不好意思答应小胡,小胡就能够通过这种间接的方式保护小游。
2.松耦合
可以使得目标对象与代理对象解耦,使得程序员可以对二者进行单独的修改和操作
小美同学可以帮助小胡送花给小游,但是当小胡和小游在一起以后,小美同学帮别人送花去了,也不会影响小胡和小游。同样的,小胡和小游的爱情也不会影响到小美同学。
3.控制访问
代理对象可以控制对目标对象的访问,可以在调用目标方法前后添加额外的逻辑,如权限验证、日志记录等。
比如其他小游的追求者想要小美同学帮忙送花,那小美同学就可以决定要不要帮其他的追求者送花,减少小胡的竞争者。
代理模式的缺点
增加了代码的复杂度,使得其他程序员需要额外理解代理的功能
相信各位看官也已经看出来了如果小胡要经过小美同学这一关的话,那么小胡还得思考小美同学可以怎样帮助自己追求小游同学,那么这样子的话整个流程就逐渐从理解小游变成了理解小美同学和小游了。
言归正传,让我们请出小美同学!!!!
我们都知道,小美同学是小游的闺蜜,那她肯定就更容易知道小游啥时候开心啦!!
js
const xm={
name:"小美同学",
age:21,
hometown:"jx",
receiveFlower:function(sender){
if(xy.emotion>=80){
xy.receiveFlower(sender)
}else{
setTimeout(function() {
xm.emotion = 99
xm.receiveFlower(sender)
console.log("已经收到")
}, 2000)
}
}
}
那么我们就可以得到小游容易接受表白的心情值啦!!!
js
const xy={
name:"小游",
age:21,
hometown:"jx",
emotion:50,
receiveFlower:function(sender){
console.log(`${this.name}收到${sender.name}的花`)
if(emotion<80){
console.log("本宫没心情,打出去")
}
else{
console.log(`${sender.name}我们在一起吧`)
}
}
}
小胡成功追到了自己的女神小游!!!
本章的小结与联想
小结
本章中我们通过小胡追求小游的故事了解到了代理模式的概念、优点和缺点,并且复习了对象的构成。每个对象和人一样,人都有自己的信息和行为,对应到对象就是对象的属性和方法,它成为了代码世界的基础构成。
联想
在这其中的"代理"的概念也是面向对象思想的重要体现,相信各位对于接口已经不太陌生了,在这里面代理对象就是与接口类似,发挥着接口相似的功能。代理设计模式其实对应着七大设计原则的依赖倒置原则的思想,也即是
- 面向接口编程,依赖于抽象而不依赖于具体
- 使用方只关注接口而不关注具体类的实现
大家有兴趣可以了解七大设计原则
最后,期待与大家的下次相见!!!!