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.保护代理:针对不同的对象有不同的访问权限,比如咱们侧边栏的权限系统;

 

代理模式我看后的理解更偏向于,基于已有对象设计模式的优化,及中间层媒介,让我们先动起手优化熟悉好项目中的各个公共组件,解耦后,再来动手编写代理也不迟

介绍设计模式的核心理念重要的是理解他的思考和抽离方式,但是设计模式却并不像公式,没法死记硬背,我也比较倾向尽可能的把一个设计模式的思想分享给大家

毕竟代码的逻辑实现可以是多种多样的,千万别被一种写法限制住了思维

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/webdev/282126.html

(0)
上一篇 2022年8月25日 09:11
下一篇 2022年8月25日 10:02

相关推荐

发表回复

登录后才能评论