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-ui中自动完成实现方法
Jun 10 Javascript
JQury slideToggle闪烁问题及解决办法
Jul 05 Javascript
网页广告中JS代码的信息监听示例
Apr 02 Javascript
JavaScript中对象property的读取和写入方法介绍
Dec 30 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 Javascript
Vue.js实战之组件的进阶
Apr 04 Javascript
WdatePicker.js时间日期插件的使用方法
Jul 26 Javascript
jQuery选择器之属性筛选选择器用法详解
Sep 19 jQuery
微信小程序实现多行文字超出部分省略号显示功能
Oct 23 Javascript
Javascript作用域和作用域链原理解析
Mar 03 Javascript
vue scroll滚动判断的实现(是否滚动到底部、滚动方向、滚动节流、获取滚动区域dom元素)
Jun 11 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
JAVA/JSP学习系列之四
2006/10/09 PHP
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
PHP的开发框架的现状和展望
2007/03/16 PHP
php5中类的学习
2008/03/28 PHP
php htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP实现简易blog的制作
2016/10/24 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
python实现无证书加密解密实例
2014/10/27 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
使用Python 统计高频字数的方法
2019/01/31 Python
Python ATM功能实现代码实例
2020/03/19 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
药学专业个人自我评价
2013/11/11 职场文书
经销商培训邀请函
2014/01/21 职场文书
先进个人总结范文
2015/02/15 职场文书
新闻发布会新闻稿
2015/07/17 职场文书