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 相关文章推荐
对google个性主页的拖拽效果的js的完整注释[转]
Apr 10 Javascript
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
Apr 21 Javascript
autoPlay 基于jquery的图片自动播放效果
Dec 07 Javascript
深入理解JQuery keyUp和keyDown的区别
Dec 12 Javascript
Javascript改变CSS样式(局部和全局)
Dec 18 Javascript
js中遍历Map对象的简单实例
Aug 08 Javascript
JavaScript学习笔记整理_setTimeout的应用
Sep 19 Javascript
Easy UI动态树点击文字实现展开关闭功能
Sep 30 Javascript
从parcel.js打包出错到选择nvm的全部过程
Jan 23 Javascript
vue 页面加载进度条组件实例
Feb 05 Javascript
详解如何在vue项目中使用lodop打印插件
Sep 27 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
Jan 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
PHP文件读写操作之文件写入代码
2011/01/13 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
Git命令之分支详解
2021/03/02 PHP
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
jQuery鼠标事件总结
2016/10/13 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
详解解决小程序中webview页面多层history返回问题
2019/08/20 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
Tensorflow简单验证码识别应用
2017/05/25 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
python os模块在系统管理中的应用
2020/06/22 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
澳大利亚牛仔裤商店:Just Jeans
2016/10/13 全球购物
后勤工作职责
2013/12/22 职场文书
预备党员考察意见范文
2015/06/01 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
MySQL分区表实现按月份归类
2021/11/01 MySQL
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python