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全部源代码
May 04 Javascript
Javascript处理DOM元素事件实现代码
May 23 Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 Javascript
Javascript Request获取请求参数如何实现
Nov 28 Javascript
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
学习JavaScript设计模式(链式调用)
Nov 26 Javascript
第三章之Bootstrap 表格与按钮功能
Apr 25 Javascript
浅谈js的ajax的异步和同步请求的问题
Oct 07 Javascript
js每隔两秒输出数组中的一项(实例)
May 28 Javascript
webpack中的热刷新与热加载的区别
Apr 09 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 Javascript
express框架下使用session的方法
Jul 31 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
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
js window.event对象详尽解析
2009/02/17 Javascript
javascript 表单验证常见正则
2009/09/28 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
js实现登录验证码
2016/12/22 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
Python中的with...as用法介绍
2015/05/28 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
关于Python 3中print函数的换行详解
2017/08/08 Python
python调用staf自动化框架的方法
2018/12/26 Python
Python解析多帧dicom数据详解
2020/01/13 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
旺仔牛奶广告词
2014/03/20 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang