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(AJAX)解析XML的代码(兼容FIREFOX/IE)
Jul 11 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
May 05 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
Feb 04 Javascript
angularjs中的e2e测试实例
Dec 06 Javascript
node.js中的querystring.parse方法使用说明
Dec 10 Javascript
javascript实现控制div颜色
Jul 07 Javascript
有关Promises异步问题详解
Nov 13 Javascript
Javascript实现检测客户端类型代码封包
Dec 03 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
Jul 18 Javascript
js实现String.Fomat的实例代码
Sep 02 Javascript
webpack打包优化的几个方法总结
Feb 10 Javascript
微信小程序仿通讯录功能
Apr 09 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
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
PHP缓存技术的使用说明
2011/08/06 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
详解javascript void(0)
2020/07/13 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
python 写的一个爬虫程序源码
2016/02/28 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
Python简单I/O操作示例
2019/03/18 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
西雅图的买手店:Totokaelo
2019/10/19 全球购物
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
幼儿园保教管理制度
2014/02/03 职场文书
电子专业自荐信
2014/07/01 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers