访问者模式

84 阅读2分钟

导言

访问者模式,英文翻译:Visitor Design Pattern.

定义

一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

好像还是没懂。。

访问者模式可以说是设计模式中最难理解的模式之一,在平时的开发中用到的估计也不多。既然定义看不懂,索性先抛到一边,顾名思义,访问者模式核心在于访问二字,在生活中,记者采访明星或某个名人,亲戚朋友来家做客,都是一种访问。记者采访明星,问的问题是有规划限制的,绝非信马由缰,想到什么问什么,不能问的偏要去问,否则注定会是一次失败的访问。还有亲戚朋友来家做客也是,客随主便,不能真当是自己家,想吃啥直接去冰箱拿,想玩什么就玩,这样大多会被主人嫌弃的。当然访问者在大的限制框架内,也可以有适当的发挥,这大体就是访问者模式的样子。

记者采访明星

我们以记者采访明星为例,用访问者模式写段代码。

例如,记者可以问:怎么走向演戏这个行业的呀?拍戏的时候有什么有趣的经历?平时有什么兴趣爱好?但对一些很敏感的话题就不能问。

let star = {
  name: 'zjl',
  motive: function () {
    return '在什么机缘巧合的情况下走向演戏这个行业的呢?'
  },
  funny: function () {
    return '拍戏的时候有什么有趣的经历?'
  },
  hobby: function () {
    return '平时有什么兴趣爱好?'
  }
}

let reporter = {
  begin: function () {
    console.log('采访开始...')
  },
  motive: function (val) {
    console.log(val)
  },
  funny: function (val) {
    console.log(val)
  },
  hobby: function (val) {
    console.log(val)
  },
  finish: function() {
    console.log('采访结束...')
  }
}
reporter.begin() // 采访开始...
reporter.motive.call(star, star.motive()) // 在什么机缘巧合的情况下走向演戏这个行业的呢?
reporter.funny.call(star, star.funny()) // 拍戏的时候有什么有趣的经历?
reporter.hobby.call(star, star.hobby()) // 平时有什么兴趣爱好?
reporter.finish() // 采访结束...

这里举的例子仅仅是话题内容由访问对象决定,当然可以进行更多的控制和发散,只是大的框架下不变的东西是需要固定的,访问者可以进行一定的逻辑调整。