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 相关文章推荐
分享20款好玩的jQuery游戏
Apr 17 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
Apr 17 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
Mar 10 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
Oct 12 Javascript
DWR中各种java方法的调用
May 04 Javascript
jQuery 全选 全部选 反选 实现代码
Aug 17 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 Javascript
JS实现小球的弹性碰撞效果
Nov 11 Javascript
jQuery三组基本动画与自定义动画操作实例总结
May 09 jQuery
Vue+Element自定义纵向表格表头教程
Oct 26 Javascript
利用Vue实现简易播放器的完整代码
Dec 30 Vue.js
详解关于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
发挥语言的威力--融合PHP与ASP
2006/10/09 PHP
用PHP和ACCESS写聊天室(四)
2006/10/09 PHP
PHP 配置文件中open_basedir选项作用
2009/07/19 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
php防止sql注入简单分析
2015/03/18 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
2009/10/25 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
React实现轮播效果
2020/08/25 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Python算术运算符实例详解
2017/05/31 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
详解python中的数据类型和控制流
2019/08/08 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
毕业自荐书
2013/12/09 职场文书
库房主管岗位职责
2013/12/31 职场文书
党在我心中演讲稿
2014/09/02 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
先进工作者推荐材料
2014/12/23 职场文书
幼儿园辞职信
2015/05/13 职场文书
《陶罐和铁罐》教学反思
2016/03/03 职场文书
Python正则表达式中flags参数的实例详解
2022/04/01 Python
Java设计模式之代理模式
2022/04/22 Java/Android