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 相关文章推荐
document 和 document.all 分别什么时候用
Jun 22 Javascript
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
javascript获取select值的方法分析
Jul 02 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
Oct 27 Javascript
Javascript实现检测客户端类型代码封包
Dec 03 Javascript
vue-ajax小封装实例
Sep 18 Javascript
angular 内存溢出的问题解决
Jul 12 Javascript
使用svg实现动态时钟效果
Jul 17 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
如何在wxml中直接写js代码(wxs)
Nov 14 Javascript
vue父子组件间引用之$parent、$children
May 20 Javascript
OpenLayers3实现测量功能
Sep 25 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数组实例总结与说明
2011/08/23 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
python标准算法实现数组全排列的方法
2015/03/17 Python
基于python的字节编译详解
2017/09/20 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
python使用Matplotlib画条形图
2020/03/25 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
python字符串的index和find的区别详解
2020/06/20 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
好的自荐信的要求
2013/10/30 职场文书
学风建设演讲稿
2014/09/12 职场文书
担保书范本
2015/01/20 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
入党介绍人意见范文
2015/06/01 职场文书
MySQL中order by的执行过程
2022/06/05 MySQL