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焦点的方法小结
Oct 08 Javascript
jQuery前端框架easyui使用Dialog时bug处理
Dec 05 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
微信小程序动态的加载数据实例代码
Apr 14 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
Jun 08 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
深入理解vue-class-component源码阅读
Feb 18 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
Jun 08 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
Sep 21 Javascript
OpenLayers3实现图层控件功能
Sep 25 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
Nov 20 Javascript
详解vue3中组件的非兼容变更
Mar 03 Vue.js
浅谈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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
php函数式编程简单示例
2019/08/08 PHP
PHP中SESSION过期设置
2021/03/09 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
python运行其他程序的实现方法
2017/07/14 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
python实现小球弹跳效果
2019/05/10 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
python实现简单的购物程序代码实例
2020/03/03 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
大学生党员自我批评
2014/02/14 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
三八妇女节寄语
2015/02/27 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL