例:该例为书中原例,小明(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.保护代理:针对不同的对象有不同的访问权限,比如咱们侧边栏的权限系统;
代理模式我看后的理解更偏向于,基于已有对象设计模式的优化,及中间层媒介,让我们先动起手优化熟悉好项目中的各个公共组件,解耦后,再来动手编写代理也不迟
介绍设计模式的核心理念重要的是理解他的思考和抽离方式,但是设计模式却并不像公式,没法死记硬背,我也比较倾向尽可能的把一个设计模式的思想分享给大家
毕竟代码的逻辑实现可以是多种多样的,千万别被一种写法限制住了思维