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下的keyCode键码值表
Apr 10 Javascript
js控制frameSet示例
Sep 10 Javascript
js替代copy(示例代码)
Nov 27 Javascript
jQuery .tmpl() 用法示例介绍
Aug 21 Javascript
jquery实现简单实用的弹出层效果代码
Oct 15 Javascript
Vue 表单控件绑定的实现示例
Aug 11 Javascript
使用jQuery实现购物车结算功能
Aug 15 jQuery
vue实现局部刷新的实现示例
Apr 16 Javascript
vue中keep-alive,include的缓存问题
Nov 26 Javascript
js事件机制----捕获与冒泡机制实例分析
May 22 Javascript
JavaScript组合设计模式--改进引入案例分析
May 23 Javascript
QT与javascript交互数据的实现
May 26 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
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
php微信支付之APP支付方法
2015/03/04 PHP
PHP.vs.JAVA
2016/04/29 PHP
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
js实现简易计算器功能
2019/10/18 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
python networkx 根据图的权重画图实现
2019/07/10 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
培训心得体会
2013/12/29 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
元旦寄语大全
2014/04/10 职场文书
农村党员一句话承诺
2014/05/30 职场文书
小学教研工作总结2015
2015/05/13 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android