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 相关文章推荐
jQuery中innerWidth()方法用法实例
Jan 19 Javascript
再谈JavaScript异步编程
Jan 27 Javascript
jQuery使用cookie与json简单实现购物车功能
Apr 15 Javascript
vue 2.0组件与v-model详解
Mar 27 Javascript
vue语法之拼接字符串的示例代码
Oct 25 Javascript
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
vue项目中使用tinymce编辑器的步骤详解
Sep 11 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
Oct 20 Javascript
深入理解vue-class-component源码阅读
Feb 18 Javascript
layui radio点击事件实现input显示和隐藏的例子
Sep 02 Javascript
Vue.js原理分析之nextTick实现详解
Sep 07 Javascript
JS代码实现页面切换效果
Jan 10 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&&mysql)六
2006/10/09 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
如何在PHP中生成随机数
2020/06/04 PHP
js 页面输出值
2008/11/30 Javascript
一个简单的javascript类定义例子
2009/09/12 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
Python操作串口的方法
2015/06/17 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
Python pymongo模块常用操作分析
2018/09/01 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
矿泉水广告词
2014/03/20 职场文书
摄影展策划方案
2014/06/02 职场文书
敬老月活动总结
2014/08/28 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
python xlwt模块的使用解析
2021/04/13 Python
Python中super().__init__()测试以及理解
2021/12/06 Python