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实现输出指定行数正方形图案的方法
Aug 03 Javascript
基于jquery实现三级下拉菜单
May 10 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
May 17 Javascript
jQuery树形控件zTree使用小结
Aug 02 Javascript
jQuery实现可展开折叠的导航效果示例
Sep 12 Javascript
概述一个页面从输入URL到页面加载完的过程
Dec 16 Javascript
AngularJs 延时器、计时器实例代码
Sep 16 Javascript
浅谈es6 javascript的map数据结构
Dec 14 Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 Javascript
详解如何在Vue里建立长按指令
Aug 20 Javascript
浅谈VUE单页应用首屏加载速度优化方案
Aug 28 Javascript
antd table按表格里的日期去排序操作
Nov 17 Javascript
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递归算法的详细示例分析
2013/02/19 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
Symfony的安装和配置方法
2016/03/17 PHP
PHP自定义错误用法示例
2016/09/28 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
Python3中函数参数传递方式实例详解
2019/05/05 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
详解Anaconda 的安装教程
2020/09/23 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
员工培训心得体会
2013/12/30 职场文书
中层竞聘演讲稿
2014/01/09 职场文书
营销团队口号
2014/06/06 职场文书
出国留学英文自荐信
2015/03/25 职场文书
订货会主持词
2015/07/01 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python