JavaScript设计模式之装饰者模式介绍


Posted in Javascript onDecember 28, 2014

装饰者模式说明

说明:通一个类来动态的对另一个类的功能对象进行前或后的修饰,给它辅加一些额外的功能; 这是对一个类对象功能的装饰,装饰的类跟被装饰的类,要求拥有相同的访问接口方法(功能),这在动态面向对象类里,一般以实现同一个接口(interface)来约束实现;装饰类的要有对被装饰类的引用,用于在装饰类的相应方法,调用相应被装饰类的方法,然后对其进行修饰;

场景举例:

1>. 比如我们生活中的穿衣服, 一件衬衣,一件西装外套,一条裤子,一条领带,一双漂亮的皮鞋; 每多穿一件,都是对前面一件或全身的装饰;

2>. 比如我们有个类下的功能方法,可能用于写日志,可能用于用户登陆这样的功能,也许写入日志前需要获取当前操作者信息,或是登录成功后,写入一条日志;写入日志之前的额外操作,它的总体来说也还是一个写日志的目的;登孙成功后写日志,它总体上也是一个登录过程的操作信息;

因此装饰者模式用于实现,两者相似操作的一种场景;就是装饰者对被装饰者功能对象的扩展,本质还是原方法相同的功能范围;

实例源码

1. 被装饰者类

function Wear() {

    

}
Wear.prototype.Shirt = function() {

    //穿了件衬衫

console.log('穿上衬衫');

}

2. 装饰者类

function Decorator(wear) {

    this.wear = wear;

}
Decorator.prototype.Shirt = function() {

    this.wear.Shirt();

    //穿了件衬衫后,我又加上了领带

}

3. 使用方法

var wear = new Wear();

var decorator = new Decorator(wear);

decorator.Shirt();

这样就实现了对 Wear 穿衬衫这个功能对象的动态扩展装饰,你也不必知道原被装饰方法是如何执行,只要知道它的功能是什么就可以,然后知道我们要对其辅加的额外功能是什么就可以;

其他说明

装饰者模式,真正提现了面向对象方法的:对扩展开放,对修改关闭的原则;所有想要的功能方法,都是在没有修改[被装饰类Wear]在扩展[装饰者这个类Decorator]的情况下进行的;

装饰者模式的一个主要特点,就是装饰者对被装饰者的引用,以实现对被装饰者的无修改装饰;

模拟下:先穿衬衫,再穿领带,再穿西装的场景: 上面的被装饰者不变了:

2. 装饰者类:

function Decorator(wear) {

    this.wear = wear;

}

Decorator.prototype.Shirt = function() {

    this.wear.Shirt(); //这里只穿衬衫;

}

3. 创建类似继承 Decorator 子类的 穿领带类与穿西装类

function Decorator_Tie(decorator) {

    this.decorator = decorator;

}    

Decorator_Tie.prototype.Shirt = function() {

    this.decorator.Shirt(); //穿上衬衫

    console.log('再戴上领带');

}
function Decorator_Western (decorator) {

    this.decorator =  decorator;

}

Decorator_Western.prototype.Shirt = function() {

    this.decorator.Shirt();

    console.log('再穿上西装');

}

使用方法:

//先穿上衬衫

var wear = new Wear();

var decorator = new Decorator(wear);

//decorator.Shirt();

//再戴上领带

var tie = new Decorator_Tie(decorator);

//tie.Shirt();

//再穿上西装

var western = new Decorator_Western(tie);

western.Shirt();

这就是一个穿衣服装饰的模拟例子;

Javascript 相关文章推荐
javascript getElementsByName()的用法说明
Jul 31 Javascript
jQuery带时间的日期控件代码分享
Aug 26 Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
Jan 20 Javascript
jQuery事件与动画基础详解
Feb 23 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
Apr 25 Javascript
JavaScript模块模式实例详解
Oct 25 Javascript
vue2.0之多页面的开发的示例
Jan 30 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
Aug 19 Javascript
JavaScript实现前端倒计时效果
Feb 09 Javascript
JavaScript实现手风琴效果
Feb 18 Javascript
浅谈Javascript Base64 加密解密
Dec 28 #Javascript
JavaScript设计模式之代理模式介绍
Dec 28 #Javascript
JavaScript设计模式之外观模式介绍
Dec 28 #Javascript
JavaScript阻止事件冒泡示例分享
Dec 28 #Javascript
jQuery中removeData()方法用法实例
Dec 27 #Javascript
jQuery中data()方法用法实例
Dec 27 #Javascript
jQuery中index()方法用法实例
Dec 27 #Javascript
You might like
用header 发送cookie的php代码
2007/03/16 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
Python continue语句用法实例
2014/03/11 Python
python提取内容关键词的方法
2015/03/16 Python
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
对pandas中to_dict的用法详解
2018/06/05 Python
python3中函数参数的四种简单用法
2018/07/09 Python
Puppeteer使用示例详解
2019/06/20 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
销售岗位职责范本
2014/06/12 职场文书
医院合作协议书
2014/08/19 职场文书
手术室护士个人总结
2015/02/13 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
干部理论学习心得体会
2016/01/21 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
python自动计算图像数据集的RGB均值
2021/06/18 Python