JS设计模式之访问者模式定义与用法分析


Posted in Javascript onFebruary 05, 2018

本文实例讲述了JS设计模式之访问者模式定义与用法。分享给大家供大家参考,具体如下:

在访问者模式中,主要包括下面几个角色

1、抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。
2、访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
3、抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
4、元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了。
5、结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等,在项目中一般很少抽象出这个角色。

实现代码:

// 访问者
function Visitor() {
 this.visit = function( concreteElement ) {
 concreteElement.doSomething();
 }
}
// 元素类
function ConceteElement() {
 this.doSomething = function() {
 console.log("这是一个具体元素");
 }
 this.accept = function( visitor ) {
 visitor.visit(this);
 }
}
// Client
var ele = new ConceteElement();
var v = new Visitor();
ele.accept( v );

访问者模式的优点

1、符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,使用访问者模式一方面符合单一职责原则,另一方面,因为被封装的操作通常来说都是易变的,所以当发生变化时,就可以在不改变元素类本身的前提下,实现对变化部分的扩展。

2、扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。

访问者模式的适用场景

1、假如一个对象中存在着一些与本对象不相干(或者关系较弱)的操作,为了避免这些操作污染这个对象,则可以使用访问者模式来把这些操作封装到访问者中去。

2、假如一组对象中,存在着相似的操作,为了避免出现大量重复的代码,也可以将这些重复的操作封装到访问者中去。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery 1.3 和 Validation 验证插件1.5.1
Jul 09 Javascript
JavaScript中两个感叹号的作用说明
Dec 28 Javascript
解析URI与URL之间的区别与联系
Nov 22 Javascript
jQuery+css实现的换页标签栏效果
Jan 27 Javascript
深入理解js数组的sort排序
May 28 Javascript
JS未跨域操作iframe里的DOM
Jun 01 Javascript
jQuery实现的事件绑定功能基本示例
Oct 11 jQuery
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
Mar 28 Javascript
js生成1到100的随机数最简单的实现方法
Feb 07 Javascript
VueJS实现用户管理系统
May 29 Javascript
JS数组及对象遍历方法代码汇总
Jun 16 Javascript
Vue自定义组件双向绑定实现原理及方法详解
Sep 03 Javascript
基于vue 动态加载图片src的解决方法
Feb 05 #Javascript
vue2.0 datepicker使用方法
Feb 04 #Javascript
js数组常用最重要的方法
Feb 04 #Javascript
jQuery Dom元素操作技巧
Feb 04 #jQuery
Vue的事件响应式进度条组件实例详解
Feb 04 #Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
Feb 04 #Javascript
Vue的土著指令和自定义指令实例详解
Feb 04 #Javascript
You might like
PHP中上传大体积文件时需要的设置
2006/10/09 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP制作用户注册系统
2015/10/23 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
Javascript hasOwnProperty 方法 & in 关键字
2008/11/26 Javascript
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
apycom出品的jQuery精美菜单破解方法
2011/02/18 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
使用python实现链表操作
2018/01/26 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
python3实现绘制二维点图
2019/12/04 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
中科软测试工程师面试题
2012/06/16 面试题
经典优秀个人求职信分享
2013/12/12 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
运动会方队口号
2014/06/07 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
硕士学位申请报告
2015/05/15 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
学生检讨书范文
2019/06/24 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis
深入解析MySQL索引数据结构
2021/10/16 MySQL