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 相关文章推荐
Array对象方法参考
Oct 03 Javascript
Javascript String.replace的妙用
Sep 08 Javascript
jquery限定文本框只能输入数字即整数和小数
Nov 29 Javascript
本人自用的global.js库源码分享
Feb 28 Javascript
AngularJS基础 ng-src 指令简单示例
Aug 03 Javascript
再谈javascript常见错误及解决方法
Sep 16 Javascript
解决jQuery使用append添加的元素事件无效的问题
Aug 30 jQuery
vue实现移动端悬浮窗效果
Dec 01 Javascript
Angular使用Restful的增删改
Dec 28 Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 Javascript
layui下拉框获取下拉值(select)的例子
Sep 10 Javascript
Vue中插槽slot的使用方法与应用场景详析
Jun 08 Vue.js
基于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
关于尾递归的使用详解
2013/05/02 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
php实现的RSS生成类实例
2015/04/23 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
基于jQuery试卷自动排版系统
2010/07/18 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
基于js 本地存储(详解)
2017/08/16 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
详解python中的装饰器
2018/07/10 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
介绍一下#error预处理
2015/09/25 面试题
新学期开学标语
2014/06/30 职场文书
农村门前三包责任书
2014/07/25 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技