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 相关文章推荐
jQuery中对未来的元素绑定事件用bind、live or on
Apr 17 Javascript
详解JavaScript中的every()方法
Jun 08 Javascript
Javascript中Array用法实例分析
Jun 13 Javascript
JavaScript基本的输出和嵌入式写法教程
Oct 20 Javascript
js实现文字超出部分用省略号代替实例代码
Sep 01 Javascript
需要牢记的JavaScript基础知识
Sep 25 Javascript
vue中$refs的用法及作用详解
Apr 24 Javascript
jQuery实现的简单手风琴效果示例
Aug 29 jQuery
JavaScript对象的特性与实践应用深入详解
Dec 30 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
May 16 Javascript
vue + typescript + 极验登录验证的实现方法
Jun 27 Javascript
详解Vue的组件中data选项为什么必须是函数
Aug 17 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
加速XP搜索功能堪比vista
2007/03/22 PHP
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
jQuery实现点击关注和取消功能
2017/07/03 jQuery
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
商务专员岗位职责
2013/11/23 职场文书
环保建议书
2014/03/12 职场文书
四年级学生评语大全
2014/04/21 职场文书
土建工程师岗位职责
2014/06/10 职场文书
国贸专业求职信
2014/06/28 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
获奖感言一句话
2015/07/31 职场文书
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python
python基础之文件操作
2021/10/24 Python
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS