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 相关文章推荐
弹出广告特效(一个IP只弹出一次)的代码
Jul 27 Javascript
JavaScript 拾碎[三] 使用className属性
Oct 16 Javascript
javascript实现带下拉子菜单的导航菜单效果
May 14 Javascript
javascript省市区三级联动下拉框菜单实例演示
Nov 29 Javascript
javascript对象的相关操作小结
May 16 Javascript
浅谈js中的变量名和函数名重名
Feb 13 Javascript
websocket+node.js实现实时聊天系统问题咨询
May 17 Javascript
浅谈react.js中实现tab吸顶效果的问题
Sep 06 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
vue scroller返回页面记住滚动位置的实例代码
Jan 29 Javascript
node.js基于socket.io快速实现一个实时通讯应用
Apr 23 Javascript
React 父子组件通信的实现方法
Dec 05 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新手谈谈我的学习心得
2007/02/25 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
详解JS函数重载
2014/12/04 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
英文自荐信
2013/12/15 职场文书
外语系毕业生自荐信范文
2013/12/16 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
超越自我演讲稿
2014/05/21 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
人工作失职检讨书
2015/05/05 职场文书
运动会主持人开幕词
2016/03/04 职场文书