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 相关文章推荐
Js中sort()方法的用法
Nov 04 Javascript
javascript 处理事件绑定的一些兼容写法
Dec 24 Javascript
jquery struts 验证唯一标识(公用方法)
Mar 27 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 Javascript
javascript函数定义的几种区别小结
Jan 06 Javascript
JavaScript实现的一个计算数字步数的算法分享
Dec 06 Javascript
ECMAScript5(ES5)中bind方法使用小结
May 07 Javascript
JS实现JSON.stringify的实例代码讲解
Feb 07 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
Dec 25 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
Mar 20 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
Sep 27 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
May 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上传、管理照片示例
2006/10/09 PHP
php实现的用户查询类实例
2015/06/18 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
python 实现调用子文件下的模块方法
2018/12/07 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
组织关系转移介绍信
2014/01/16 职场文书
师生聚会感言
2014/01/26 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
协议书格式
2014/04/23 职场文书
大学社团活动总结
2014/04/26 职场文书
教师节感想
2015/08/11 职场文书
python3.9之你应该知道的新特性详解
2021/04/29 Python
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript