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读写XML实现广告轮换(兼容IE、FF)
Aug 09 Javascript
JavaScript动态插入script的基本思路及实现函数
Nov 11 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
js匿名函数作为函数参数详解
Jun 01 Javascript
vue-router跳转页面的方法
Feb 09 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
在页面中引入js的两种方法(推荐)
Aug 29 Javascript
angular4实现tab栏切换的方法示例
Oct 21 Javascript
JavaScript创建对象的常用方式总结
Aug 10 Javascript
react中使用css的7中方式(最全总结)
Feb 11 Javascript
原生js实现下拉框选择组件
Jan 20 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在window iis的莫名问题的测试方法
2013/05/14 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
dedecms集成财付通支付接口
2014/12/28 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
jQuery 全选效果实现代码
2009/03/23 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
Python里隐藏的“禅”
2014/06/16 Python
Python中zfill()方法的使用教程
2015/05/20 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
python 实现简单的FTP程序
2019/12/27 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
怎样有效的进行自我评价
2013/10/06 职场文书
企业申诉管理制度
2014/01/30 职场文书
地雷战观后感
2015/06/09 职场文书
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python