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 相关文章推荐
input 高级限制级用法
Mar 26 Javascript
javascript+iframe 实现无刷新载入整页的代码
Mar 17 Javascript
用javascript为页面添加天气显示实现思路及代码
Dec 02 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
详解Node.js中的事件机制
Sep 22 Javascript
jQuery Checkbox 全选 反选的简单实例
Nov 29 Javascript
jQuery实现链接的title快速出现的方法
Feb 20 Javascript
vue.js如何将echarts封装为组件一键使用详解
Oct 10 Javascript
angular json对象push到数组中的方法
Feb 27 Javascript
vue element 关闭当前tab 跳转到上一路由操作
Jul 22 Javascript
Vue 同步异步存值取值实现案例
Aug 05 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
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
PHP 翻页 实例代码
2009/08/07 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
jQuery的学习步骤
2011/02/23 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
javascript history对象详解
2017/02/09 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
python进程管理工具supervisor使用实例
2014/09/17 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
经理职责范文
2013/11/08 职场文书
初三物理教学反思
2014/01/21 职场文书
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
考察邀请函范文
2015/01/31 职场文书
工作态度不好检讨书
2015/05/06 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
css3新特性的应用示例分析
2022/03/16 HTML / CSS
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸