Javascript:设计模式-代理模式
2022/8/25 14:23:03
本文主要是介绍Javascript:设计模式-代理模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
例:该例为书中原例,小明(xiaoming)遇到了女神(A),打算送个花来告白,刚好小明打听到女神有个朋友叫(B),自己不太好意思,所以决定让B来送花,虽然这件事儿肯定是凉了,但是作为例子还是很有教育意义
代码实现:不用代理模式,头铁直接送
var Flower = function () {}
// 小明做的事
var xiaoming = {
// 方法函数:发送花
sendFlower: function (target) {
// 买花
var flower = new Flower()
target.receiveFlower(flower)
}
}
// 小A做的事
var A = {
// 方法函数:收到花
receiveFlower: function (flower) {
console.log( '收到花 ' + flower)
}
}
// 小明送花给A
xiaoming.sendFlower(A)
|
代码实现:引入代理找朋友送
var Flower = function () {}
var xiaoming = {
sendFlower: function (target) {
var flower = new Flower()
target.receiveFlower(flower)
}
}
var B = {
receiveFlower: function (flower) {
A.receiveFlower(flower)
}
}
var A = {
receiveFlower: function (flower) {
console.log( '收到花 ' + flower)
}
}
xiaoming.sendFlower(B)
|
执行结果是一样的,那么这么做的意义是什么呢,看起来只是把简单的事情变得复杂了,像脱裤子放屁多此一举,自己送花跟找别人送有什么区别?
那我们现在来改变背景设定,假设当 A 在心情好的时候收到花,小明表白成功的几率有 60%,而当 A 在心情差的时候收到花,小明表白的成功率无限趋近于 0。
小明跟 A 刚刚认识两天,还无法辨别 A 什么时候心情好。如果不合时宜地把花送给 A,花 被直接扔掉的可能性很大,这束花可是小明吃了 7 天泡面换来的。
但是 A 的朋友 B 却很了解 A,所以小明只管把花交给 B,B 会监听 A 的心情变化,然后选 择 A 心情好的时候把花转交给 A,
代码实现:
var Flower = function () {}
var xiaoming = {
sendFlower: function (target) {
var flower = new Flower()
target.receiveFlower(flower)
}
}
var B = {
receiveFlower: function (flower) {
A.listenGoodMood( function () {
// 监听 A 的好心情
A.receiveFlower(flower)
})
}
}
var A = {
receiveFlower: function (flower) {
console.log( '收到花 ' + flower)
},
listenGoodMood: function (fn) {
setTimeout( function () {
// 假设 10 秒之后 A 的心情变好
fn()
}, 10000)
}
}
xiaoming.sendFlower(B)
|
像这种操作有个高端的词,叫保护代理,让B过滤掉一些渣男,另外,假设现实中的花价格不菲,导致在程序世界里,new Flower 也是一个代价昂贵的操作
那么我们可以把 new Flower 的操作交给代理 B 去执行,代理 B 会选择在 A 心情好时再执行 new Flower,
这是代理模式的另一种形式,叫作虚拟代理。虚拟代理把一些开销很大的对象,延迟到 真正需要它的时候才去创建。
代码如下:
var B = {
receiveFlower: function (flower) {
A.listenGoodMood( function () {
// 监听 A 的好心情
var flower = new Flower() // 延迟创建 flower 对象
A.receiveFlower(flower)
})
}
}
|
作为类的职责来讲,一个类应该只有一种引起它变化的原因,如果一个对象承担多个职责,那么它将变得越来越大难以维护,当多种职责耦合在一起时,反而丧失了当时设计和创建它时的初衷
代理模式的例子部分书中引用:
1.比如井下项目中,接收和驳回请求一条数据时,不是点击一条接收一条,而是通过方法媒介收集你选中的ID,通过方法去确认所有接收的数据;
2.缓存模式,在第一次接收到数据的时候,并没有破坏原本的对象,而是缓存了起来,比如,选择项目名称,分页也同理可以达到目的;
3.防火墙代理:保护网络资源访问及核心权限不被靠近;
4.保护代理:针对不同的对象有不同的访问权限,比如咱们侧边栏的权限系统;
代理模式我看后的理解更偏向于,基于已有对象设计模式的优化,及中间层媒介,让我们先动起手优化熟悉好项目中的各个公共组件,解耦后,再来动手编写代理也不迟
介绍设计模式的核心理念重要的是理解他的思考和抽离方式,但是设计模式却并不像公式,没法死记硬背,我也比较倾向尽可能的把一个设计模式的思想分享给大家
毕竟代码的逻辑实现可以是多种多样的,千万别被一种写法限制住了思维
这篇关于Javascript:设计模式-代理模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-01为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用
- 2024-04-26敏捷开发:想要快速交付就必须舍弃产品质量?
- 2024-04-26静态代码分析的这些好处,我竟然都不知道?
- 2024-04-26你在测试金字塔的哪一层?(下)
- 2024-04-26快刀斩乱麻,DevOps让代码评审也自动起来
- 2024-04-262024年最好用的10款ER图神器!
- 2024-04-2203-为啥大模型LLM还没能完全替代你?
- 2024-04-2101-大语言模型发展
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署