js代理模式(日常笔记)

代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景。比如,明星都有经纪人作为代理。如果想请明星来办一场商业演出,只能联系他的经纪人。经纪人会把商业演出的细节和报酬都谈好之后,再把合同交给明星签。

案例:小明追女神

小明喜欢我们的女神,小明打算在一天后给女神表白。这时,小明打听到他们共同有一个好友小红,他把买来的花给了小红代替提交给女神。

直接送花的小明
var Flower = function (name) {
    this.name = name
}
var xiaoming = {
	sendFlower:function(target){
		var flower = new Flower('百合花')
		target.receiveFlower(flower)
	}
}
var nvsheng ={
	 receiveFlower: function (flower) {
        console.log('我收到花了,但我不喜欢你的' + flower.name+',更不喜欢你的人');
     }
}
xiaoming.sendFlower(nvsheng)

虽然小明的故事必然以悲剧收场,因为追 MM 更好的方式是送一辆宝马。

让我们的小红给女神送花
var Flower = function (name) {
    this.name = name
}
var xiaoming = {
	sendFlower:function(target){
		var flower = new Flower('百合花')
		target.receiveFlower(flower)
	}
}
var xiaohong ={
	receiveFlower:function(flower){
		nvsheng.receiveFlower(flower)
	}
}
var nvsheng ={
	 receiveFlower: function (flower) {
        console.log('我收到花了,但我不喜欢你的' + flower.name+',更不喜欢你的人');
     }
}
xiaoming.sendFlower(xiaohong)

很显然,执行结果跟第一段代码一致,至此我们就完成了一个最简单的代理模式的编写。也许读者会疑惑,小明自己去送花和代理 B 帮小明送花,二者看起来并没有本质的区别,引入一个代理对象看起来只是把事情搞复杂了而已。

让小红做点事情

小红监听女神的心情,假设当 A 在心情好的时候收到花,小明表白成功的几率有60%,而当 A 在心情差的时候收到花,小明表白的成功率无限趋近于 0。

  var Flower = function (name) {
       this.name = name
   }
   var xiaomiming = {
       sendFlower: function (target) {
           target.receiveFlower(flower)
       }
   }
   var xiaohong = {
       receiveFlower: function (flower) {
           nvsheng.listenGoodMood(function(){
               var flower = new Flower('百合')
               nvsheng.receiveFlower(flower)
           })
       }
   }
   var nvsheng = {
       receiveFlower: function (flower) {
           console.log('收到' + flower.name);
       },
       listenGoodMood: function (fn) {
           setTimeout(function () {
               fn()
           }, 5000)
       }
   }
   xiaoming.sendFlower(xiaohong)

虽然这只是个虚拟的例子,但我们可以从中找到两种代理模式的身影。代理 小红 可以帮助 女神 过滤掉一些请求,比如送花的人中年龄太大的或者没有宝马的,这种请求就可以直接在代理 小红 处被绝掉。这种代理叫作保护代理。女神 和 小红 一个充当白脸,一个充当黑脸。白脸 女神 继续保持 良好的女神形象,不希望直接拒绝任何人,于是找了黑脸 小红 来控制对 小红 的访问。

另外,假设现实中的花价格不菲,导致在程序世界里,new Flower 也是一个代价昂贵的操作, 那么我们可以把 new Flower 的操作交给代理 B 去执行,代理 B 会选择在 A 心情好时再执行 new Flower,这是代理模式的另一种形式,叫作虚拟代理。虚拟代理把一些开销很大的对象,延迟到 真正需要它的时候才去创建。

代理模式的概念

对于上面的例子,女神就相当于被代理的目标对象(Target),而小红就相当于代理对象(Proxy),希望找女神的人是访问者(Visitor),他们直接找不到女神,只能找女神的经纪人来进行业务商洽。主要有以下几个概念:

Target: 目标对象,也是被代理对象,是具体业务的实际执行者;
Proxy: 代理对象,负责引用目标对象,以及对访问的过滤和预处理;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值