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 相关文章推荐
editable.js 基于jquery的表格的编辑插件
Oct 24 Javascript
Js+Jq获取URL参数的集中方法示例代码
May 20 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
Mar 05 Javascript
JS+CSS实现的拖动分页效果实例
May 11 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
Javascript中字符串和数字的操作方法整理
Jan 22 Javascript
JavaScript实现反转字符串的方法详解
Apr 27 Javascript
基于vue实现swipe分页组件实例
May 25 Javascript
vue实现商品加减计算总价的实例代码
Aug 12 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
JavaScript实现tab栏切换效果
Mar 16 Javascript
Node.js API详解之 readline模块用法详解
May 22 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 三维饼图的实现代码
2008/09/28 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用PDB模式调试Python程序介绍
2015/04/05 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
公务员培训心得体会
2013/12/28 职场文书
超市国庆节促销方案
2014/02/20 职场文书
元旦晚会感言
2014/03/12 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
教师个人培训总结
2015/02/11 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
升学宴家长答谢词
2015/09/29 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android
Java实现房屋出租系统详解
2021/10/05 Java/Android