javascript设计模式 ? 访问者模式原理与用法实例分析


Posted in Javascript onApril 26, 2020

本文实例讲述了javascript设计模式 ? 访问者模式原理与用法。分享给大家供大家参考,具体如下:

介绍:访问者模式比较复杂,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对他们进行不同的访问操作。访问者模式的主要目的是将数据结构与数据操作相分离。

定义:提供一个作用于某对象结构中的个元素的操作表示,它使得可以再不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式

场景:使用PC结构demo来解释下访问者模式

示例:

var Keyboard = function(){
  this.accept = function(computerPartVisitor){
    computerPartVisitor.visit(this);
  }
}
 
var Monitor = function(){
  this.accept = function(computerPartVisitor){
    computerPartVisitor.visit(this);
  }
}
 
var Mouse = function(){
  this.accept = function(computerPartVisitor){
    computerPartVisitor.visit(this);
  }
}
 
var Computer = function(){
  var parts = [new Keyboard(), new Monitor(), new Mouse()];
 
  this.accept = function(computerPartVisitor){
    computerPartVisitor.visit(this);
    _acceptAll(computerPartVisitor);
  }
 
  var _acceptAll = function(computerPartVisitor){
    parts.map(function(item){
      item.accept(computerPartVisitor)
    });
  }
}
 
var ComputerPartDisplayVisitor = function(){
  this.visit = function(item){
    if(item.constructor == Keyboard){
      console.log("Displaying Keyboard.");
    }else if(item.constructor == Monitor){
      console.log("Displaying Monitor.");
    }else if(item.constructor == Mouse){
      console.log("Displaying Mouse.");
    }else if(item.constructor == Computer){
      console.log("Displaying Computer.");
    }else{
      console.log("Error");
    }
  }
}
 
var computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
// Displaying Computer.
// Displaying Keyboard.
// Displaying Monitor.
// Displaying Mouse.

这个模式比较复杂,我们先介绍下组成:

  • ComputerPartDisplayVisitor称为访问者,它为对象结构中的每一个具体元素例如Keyboard,Mouse等声明一个访问操作。当访问Keyboard时就会输出Displaying Keyboard。
  • Keyboard,Monitor,Mouse称为元素,他们包含一个accept方法,用来触发传递进来的访问者
  • Computer称为对象结构,它是一个元素的集合。parts数组用于存放元素对象,以供不同访问者访问。_acceptAll方法用来遍历内部元素。
  • 访问者通过accept访问元素内部,元素内部也可以通过参数调用访问者的visit方法。这种调用机制称为双重分派。

访问者模式总结:

优点:
* 增加新的访问操作便捷,只需要加一个新的访问者类。
* 将有关原色对象的访问行为集合到一个访问者对象中,类的职责更清晰。
* 让用户在不修改现有元素层次结构的情况下,定义作用于该层次结构的操作。

缺点:
* 增加新的元素类很困难,在访问者模式下,每增加一个新的元素,对应要增加访问者中的操作。
* 破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作,这意味着元素必须暴露一些内部操作和内部状态。

适用场景:
* 一个对象结构包含多个类型的对象,希望对这些对象实施一些依赖其具体类型的操作。
* 需要对一个对象结构中的对象进行横多不同的并且不相关的操作,而且需要避免让这些操作污染这些对象的类。
* 对象结构中对象对应的类很少改变,但经常需要再次对象结构上定义新的操作。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
Mar 24 Javascript
基于jquery的跨域调用文件
Nov 19 Javascript
网页打开自动最大化的js代码
Aug 22 Javascript
jquery插件star-rating.js实现星级评分特效
Apr 15 Javascript
JavaScript操作class和style样式代码详解
Feb 13 Javascript
JS验证图片格式和大小并预览的简单实例
Oct 11 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
JavaScript实现的XML与JSON互转功能详解
Feb 16 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
Mar 13 Javascript
ElementUI Tag组件实现多标签生成的方法示例
Jul 08 Javascript
JavaScript复制变量三种方法实例详解
Jan 09 Javascript
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 Javascript
详解关于Vue单元测试的几个坑
Apr 26 #Javascript
es6函数之箭头函数用法实例详解
Apr 25 #Javascript
es6数组之扩展运算符操作实例分析
Apr 25 #Javascript
es6函数之尾调用优化实例分析
Apr 25 #Javascript
es6函数之尾递归用法实例分析
Apr 25 #Javascript
javascript 易错知识点实例小结
Apr 25 #Javascript
javascript执行上下文、变量对象实例分析
Apr 25 #Javascript
You might like
杏林同学录(一)
2006/10/09 PHP
来自PHP.NET的入门教程
2006/10/09 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
PHP全局变量与超级全局变量区别分析
2016/04/01 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
2015/08/13 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
2018/05/22 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
Python列表切片常用操作实例解析
2019/12/16 Python
python多线程使用方法实例详解
2019/12/30 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
电气专业推荐信范文
2013/11/18 职场文书
《纸船和风筝》教学反思
2014/02/15 职场文书
行政管理专业求职信
2014/07/06 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
计生工作先进事迹
2014/08/15 职场文书
抗洪救灾标语
2014/10/08 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
python中的None与NULL用法说明
2021/05/25 Python
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
Android中View.post和Handler.post的关系
2022/06/05 Java/Android