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 相关文章推荐
javascript之Partial Application学习
Jan 10 Javascript
处理文本部分内容的TextRange对象应用实例
Jul 29 Javascript
javascript实现iframe框架延时加载的方法
Oct 30 Javascript
javascript获取四位数字或者字母的随机数
Jan 09 Javascript
jQuery实现列表的全选功能
Mar 18 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
Jun 05 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
Mar 21 Javascript
AngularJS学习第二篇 AngularJS依赖注入
Feb 13 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
Feb 27 Javascript
js+css实现打字效果
Jun 24 Javascript
微信小程序如何再次获取用户授权的方法
May 10 Javascript
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 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
浅析PHP水印技术
2007/02/14 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
vue项目中使用fetch的实现方法
2019/04/25 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
js实现微信聊天效果
2020/08/09 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
行政专员岗位职责
2014/01/02 职场文书
给朋友的道歉信
2014/01/09 职场文书
优秀班组长事迹
2014/05/31 职场文书
本科应届生自荐信
2014/06/29 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
公司安全管理制度范本
2015/08/05 职场文书
合作意向书怎么写
2019/06/24 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
JS实现简单的九宫格抽奖
2022/06/28 Javascript