装饰者模式

装饰者模式(Decorator): 在不改变原对象的基础上,通过对其进行过包装拓展(添加属性高或者方法)使原有对象可以满足用户的更复杂需求。

如果现在我们有个需求,需要做一个提交表单,当我们选中输入框的时候,输入框旁会显示相应提示,或许我们会这样做:

html中我们会添加一个输入框,后面放一个隐藏的提示信息

<input type="text" id="tel" />
<span id="tel_text" style="display: none;">请输入手机号</span>

然后在js里

var tel=document.getElementById('tel');
var teltext=document.getElementById('tel_text');
tel.onclick=function(){
teltext.style.display='inline-block';
}

当输入框被点击选中时,我们显示之前隐藏的提示信息。

但是如果这个时候我们的需求改变,正常的时候显示必填的提示信息,当用户点击输入框时隐藏必填的输入提示,显示所填字段验证格式的提示。那么我们可能会这么修改:

<input type="text" id="tel" />
<span id="tel_text">请输入手机号</span>
<span id="tel_validation" style="display: none;">手机号必须是11位数</span>

然后我们会在js中做相应的调整,我们会隐藏必填提示,显示验证提示

var tel=document.getElementById('tel');
var teltext=document.getElementById('tel_text');
var telvalidation=document.getElementById('tel_validation');
tel.onclick=function(){
teltext.style.display='none';
telvalidation.style.display='inline-block';
}

但是现在有个问题,我们表单一定会有很多数据项,那么用这种方式,我们必须一个个去找之前写的方法代码在去里面一个个修改,很麻烦。

使用装饰者模式装饰已有功能

这个时候我们就可以用到装饰者模式

var garnish=function(input,fn){
//获取事件源
var input=document.getElementById(input);
//判断事件源是否绑定事件
if(typeof input.onclick==='function'){
//缓存事件源原有回调函数
var oldClickFn=input.onclick;
//为事件源定义新的事件
input.onclick=function(){
//事件源原有回调函数
oldClickFn();
//新增的回调函数
fn();
}
}else{
//如果事件源未绑定,直接为事件源添加新增回调函数
input.onclick=fn;
}
}

现在我们通过装饰者模式就不用一个个去找之前的逻辑在去修改了,我们通过装饰者模式调用试一下吧。

garnish('tel',function(){
var telvalidation=document.getElementById('tel_validation');
teltext.style.display='none';
telvalidation.style.display='inline-block';
});

通过使用装饰者模式我们发现无论输入框是否绑定过事件,都可以轻松完成我们的需求,装饰者模式很简单,就是对原有对象的属性与方法的添加

总结

在我们对原有功能不了解的情况下如果要对功能进行扩展装饰者模式可能是不错的选择,当然同样对原有对象进行扩展的模式还有我们之前讲到的适配器模式,但是两者不同的是,适配器模式对对象进行扩展时,很多时候时对对象内部结构的重构,因此必须要了解其自身的结构,而装饰者模式对对象的扩展是一种良性扩展,不用了解其具体实现,只是在外部进行了一次封装扩展,这又是对原有功能完整性的一种保护。

也谢谢大家看到这里:)如果你觉得我的分享还可以请点击推荐,分享给你的朋友让我们一起进步~

好了以上就是本次分享的全部内容,本次示例参考自JavaScript设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

欢迎转载,转载请注明作者,原文出处。

再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)的更多相关文章

  1. 再起航,我的学习笔记之JavaScript设计模式05(简单工程模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  2. 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)

    上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...

  3. 再起航,我的学习笔记之JavaScript设计模式05(简单工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  4. 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  5. 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  6. 再起航,我的学习笔记之JavaScript设计模式30(简单模板模式)

    简单模板模式 概念介绍 简单模板模式(Simple template): 通过格式化字符串拼凑出视图避免创建视图时大量节点操作,优化内存开销. 创建模板 在实际的业务中如果我们需要进行前后台交互,或多 ...

  7. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  8. 再起航,我的学习笔记之JavaScript设计模式16(享元模式)

    ### 享元模式 **享元模式(Flyweight):** 运用共享技术有效地支持大量的细粒度的对象,避免对象间拥有相同内容造成多余的开销. 上回我们在组合模式中创建了文章列表类,这次我们要向不同的文 ...

  9. 再起航,我的学习笔记之JavaScript设计模式02

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...

随机推荐

  1. POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups / HDU 1699 Jamie's Contact Groups / SCU 1996 Jamie's Contact Groups (二分,二分图匹配)

    POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups ...

  2. iOS是最安全的?苹果iOS恶意软件数量增速首次超过Android

    之前小编还说Android系统似乎已经成为世界各地病毒作者的首选目标,但是近日一份安全研究报告让小编啪啪打脸. Skycure的移动安全报告显示,近三个季度内,在iOS上运行的恶意软件增加了2倍多,而 ...

  3. Phpcms安装前后域名默认访问路径

    一.安装前 phpcms下载后index.html文件内容如下图,在本地服务器配置项目虚拟域名后,访问域名后直接跳到:域名/install/install.php,然后出现安装界面. 二.安装之后 提 ...

  4. 文件的默认权限UMASK

    当进入Linux系统后新创建的文件或者文件夹总是会有一个默认的权限,那么这个权限是如何设置的呢? umask就是设置文件与目录的默认权限 1. 查看umask 直接查看, [root@centos6 ...

  5. pyqt5 在qt designer后以弹窗的方式连接多个UI图形界面

    当我们通过pyqt开发时,eric6为我们提供了一个方便的工具:图形化的绘制UI工具--qt designer. 我们可以通过它开发多个UI,然后利用信号-槽工具,将功能代码附着在上面.也可以将多个界 ...

  6. JStorm与Storm源码分析(一)--nimbus-data

    Nimbus里定义了一些共享数据结构,比如nimbus-data. nimbus-data结构里定义了很多公用的数据,请看下面代码: (defn nimbus-data [conf inimbus] ...

  7. tomcat的常用配置方法

    1.tomcat配置某个站点的欢迎页面的方法 2.tomcat配置虚拟目录的方法 3.tomcat配置虚拟主机的方法

  8. pygal的简单使用

    pygal的简单使用 例子来自此书: <Python编程从入门到实战>[美]Eric Matthes pygal是一个SVG图表库.SVG是一种矢量图格式.全称Scalable Vecto ...

  9. Python 爬虫抓取代理IP,并检测联通性

    帮朋友抓了一些代理IP,并根据测试联的通性,放在了不通的文件夹下.特将源码分享 注意: 1,环境Python3.5 2,安装BeautifulSoup4  requests 代码如下: 1 2 3 4 ...

  10. ASP.NET windows验证IIS配置

    Windows验证时,需要配置IIS,把匿名验证设为disable,windows验证设为enable,window7 默认为匿名验证为enable,windows验证为disable. 否则会sys ...