javascript设计模式 ? 装饰模式原理与应用实例分析


Posted in Javascript onApril 14, 2020

本文实例讲述了javascript设计模式 ? 装饰模式原理与应用。分享给大家供大家参考,具体如下:

介绍:装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为。在现实生活中,这种情况也到处存在,例如一张照片,可以不改变照片本身,通过增加一个相框,使其具有防潮的功能。装饰模式是一种用于替代继承的技术,它使用对象之间的关联关系来取代继承关系。

定义:动态的给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构模型。

场景:我们现有一个Circle类用来画一个圆,新的需求要求画一个红色的圆,又一个新的需求要求我们画一个半径20的圆,又一个新的需求要求我们画一个红色的,半径20的圆。
如何设计才能让我们的代码来兼容这样的需求呢?我们首先给Circle类包装一个颜色的相框,这个相框用来改变圆的颜色。再给Circle类包装一个大小的相框,这个相框用来改变圆的大小。通过不同的相框组合来达到想要的效果。

示例:

var Circle = function(){
  this.draw = function(){
    console.log('画圆');
  };
}
 
var ColorDecorator = function(circle){
  this.circle = circle;
  this.draw = function(){
    this.circle.draw();
    setColor();
    return this.circle;
  }
  function setColor(){
    console.log('红色');
  }
}
 
var RadiusDecorator = function(circle){
  this.circle = circle;
  this.draw = function(){
    this.circle.draw();
    setRadius();
  }
  function setRadius(){
    console.log('半径:20px')
  }
}
 
var circle = new Circle();
 
var redCricle = new ColorDecorator(circle);
 
var radiusCricle = new RadiusDecorator(circle);
 
var radiusRedCircle = new RadiusDecorator(new ColorDecorator(circle));
 
//输出:
circle.draw();  //画圆
 
redCricle.draw(); //画圆 红色
 
radiusCricle.draw(); //画圆 半径:20px
 
radiusRedCircle.draw(); //画圆 红色 半径:20px

以上就是装饰模式的示例,比较好懂,在不改变Circle类基础上进行扩展,通过包装一层来实现新特性。降低了系统的耦合度。与继承结构相比,装饰模式大大减少了子类的个数,让系统扩展起来更加方便,而且更容易维护。RadiusDecorator,ColorDecorator称为装饰类,他们的引入将大大简化系统的设计,他也是装饰模式的核心。

装饰模式总结:

优点:
* 便于扩展一个对象的功能,装饰模式比继承更加具有灵活性,不会导致类的个数急剧增加。
* 可以通过一种动态的方式来扩展一个对象的功能。
* 可以对一个对象进行多次装饰,通过不同的装饰类组合,可以创造很多不同行为的组合,得到功能更强大的对象

缺点:
* 使用装饰模式过程中会产生很多小对象,一定程度影响程序性能。
* 装饰模式特别灵活,同时也意味着更加容易出错,排除复杂度也不低。

适用场景:
* 不影响对象的基础下进行扩展,添加职责

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

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

Javascript 相关文章推荐
面向对象的javascript(笔记)
Oct 06 Javascript
有道JavaScript监听浏览器的问题
Jun 23 Javascript
js字符串转换成xml对象并使用技巧解读
Apr 18 Javascript
jQuery操作DOM之获取表单控件的值
Jan 23 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
Apr 11 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
Vue前后端不同端口的实现方法
Sep 19 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
js 闭包深入理解与实例分析
Mar 19 Javascript
Jquery使用each函数实现遍历及数组处理
Jul 14 jQuery
javascript设计模式 ? 组合模式原理与应用实例分析
Apr 14 #Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
Apr 14 #Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 #Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
Apr 13 #Javascript
vue cli3适配所有端方案的实现
Apr 13 #Javascript
RxJS在TypeScript中的简单使用详解
Apr 13 #Javascript
JS错误处理与调试操作实例分析
Apr 13 #Javascript
You might like
php生成html文件方法总结
2014/12/01 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
python使用webbrowser浏览指定url的方法
2015/04/04 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
基于python plotly交互式图表大全
2019/12/07 Python
python类中super() 的使用解析
2019/12/19 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
财会自我鉴定范文
2013/12/27 职场文书
临床护理求职信
2014/04/26 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
Django migrate报错的解决方案
2021/05/20 Python
php去除数组中为0的元素的实例分析
2021/11/17 PHP
Django中celery的使用项目实例
2022/07/07 Python