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 相关文章推荐
mapper--图片热点区域高亮组件官方站点
Dec 22 Javascript
document.getElementById为空或不是对象的解决方法
Jan 24 Javascript
基于jquery的时间段实现代码
Aug 02 Javascript
基于jquery实现点击左右按钮图片横向滚动
Apr 11 Javascript
实例讲解JS中数组Array的操作方法
May 09 Javascript
JavaScript实现数字数组按照倒序排列的方法
Apr 06 Javascript
JavaScript类型系统之Object详解
Jan 07 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
Aug 30 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
Sep 27 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
前端性能优化建议
Sep 17 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文件上传后端处理小技巧
2016/05/22 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
详解RequireJs官方使用教程
2017/10/31 Javascript
解读ES6中class关键字
2017/11/20 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
python分析apache访问日志脚本分享
2015/02/26 Python
python输出指定月份日历的方法
2015/04/23 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
django模板结构优化的方法
2019/02/28 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
优秀士兵先进事迹
2014/02/06 职场文书
市场推广策划方案
2014/06/02 职场文书
2014年酒店前台工作总结
2014/11/14 职场文书
公司2014年度工作总结
2014/12/10 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python
JavaCV实现照片马赛克效果
2022/01/22 Java/Android