原文接:https://www.jianshu.com/p/fe6abe29723f

GOF官方定义: 访问者模式是表示一个作用于某个对象结构中的各元素的操作。它使可以在不改变各元素的类的前提下定义作用于这些元素的新操作。我们在使用一些操作对不同的 对象进行处理时,往往会根据不同的对象选择不同的处理方法和过程。在实际的代码过程中,我们可以发现,如果让所有的操作分散到各个对象中,整个系统会变得 难以维护和修改。且增加新的操作通常都要重新编译所有的类。因此,为了解决这个问题,我们可以将每一个类中的相关操作提取出来,包装成一个独立的对象,这 个对象我们就称为访问者(Visitor)。利用访问者,对访问的元素进行某些操作时,只需将此对象作为参数传递给当前访问者,然后,访问者会依据被访问 者的具体信息,进行相关的操作。
**据统计,上面这段话只有5%的人会看到最后一句。那么通俗点讲,访问者模式先把一些可复用的行为抽象到一个函数(对象)里,这个函数我们就称为访问 者(Visitor)。如果另外一些对象要调用这个函数,只需要把那些对象当作参数传给这个函数,在js里我们经常通过call或者apply的方式传递 this对象给一个Visitor函数.

举例

  1. // 访问者模式:数组方法封装
  2. var Visitor = (function() {
  3. return {
  4. splice: function() {
  5. var args = Array.prototype.splice.call(arguments, 1);
  6. return Array.prototype.splice.apply(arguments[0], args);
  7. },
  8. push: function() {
  9. var len = arguments[0].length || 0;
  10. var args = this.splice(arguments, 1);
  11. arguments[0].length = len + arguments.length - 1;
  12. return Array.prototype.push.apply(arguments[0], args);
  13. },
  14. pop: function() {
  15. return Array.prototype.pop.apply(arguments[0]);
  16. }
  17. }
  18. })();
  1. var a = new Object();
  2. Visitor.push(a,1,2,3,4);
  3. Visitor.push(a,4,5,6);
  4. Visitor.pop(a);
  5. Visitor.splice(a,2);

4、小结
访问者模式解决了数据与数据的操作方法之间的耦合,让数据的操作方法独立于数据,使其可以自由演变。因此,访问者模式更适合于那些数据稳定、但数据的操作方法易变的环境下。
当操作环境改变时,可以自由修改数据的操作方法,实现操作方法的拓展,以适应新的操作环境,而无须修改原数据。如此,对于同一个数据,它可以被多个访问对象所访问,这极大地增加了数据操作的灵活性。