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动态调整iframe高度的方法
Mar 06 Javascript
基于JQuery的日期联动实现代码
Feb 24 Javascript
jquery插件之定时查询待处理任务数量
May 01 Javascript
JS与jQ读取xml文件的方法
Dec 08 Javascript
JS获取IMG图片高宽的简单实例
May 17 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
Jun 25 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
Apr 20 Javascript
Vuex利用state保存新闻数据实例
Jun 28 Javascript
基于layui的table插件进行复选框联动功能的实现方法
Sep 19 Javascript
刷新页面后让控制台的js代码继续执行
Sep 20 Javascript
微信小程序图片加载失败时替换为默认图片的方法
Dec 09 Javascript
nuxt 每个页面head标签内容设置方式
Nov 05 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
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
php魔术变量用法实例详解
2014/11/13 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
初步了解javascript面向对象
2015/11/09 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python的else子句使用指南
2016/02/27 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
创业计划书怎样才能打动风投
2014/01/01 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
工程移交协议书
2016/03/24 职场文书