再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)
装饰者模式
装饰者模式(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(装饰者模式)的更多相关文章
- 再起航,我的学习笔记之JavaScript设计模式05(简单工程模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...
- 再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)
上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式. 工厂方法模式 工厂方法模式(Factory Method):通过对产品类的抽象使其创建 ...
- 再起航,我的学习笔记之JavaScript设计模式05(简单工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...
- 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- 再起航,我的学习笔记之JavaScript设计模式30(简单模板模式)
简单模板模式 概念介绍 简单模板模式(Simple template): 通过格式化字符串拼凑出视图避免创建视图时大量节点操作,优化内存开销. 创建模板 在实际的业务中如果我们需要进行前后台交互,或多 ...
- 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)
中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...
- 再起航,我的学习笔记之JavaScript设计模式16(享元模式)
### 享元模式 **享元模式(Flyweight):** 运用共享技术有效地支持大量的细粒度的对象,避免对象间拥有相同内容造成多余的开销. 上回我们在组合模式中创建了文章列表类,这次我们要向不同的文 ...
- 再起航,我的学习笔记之JavaScript设计模式02
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...
随机推荐
- zip & tar 压缩文件时排除某个文件夹
确实是用参数 -x aaa bbb 两个文件夹要写全路径. 如 zip -r test.zip test -x /test/aaa/* -x /test/bbb/* 既包含了文件夹,也可以 zip - ...
- java基础06 IO流
IO用于在设备间进行数据传输的操作. Java IO流类图结构: IO流分类 字节流: InputStream FileInputStream BufferedInputStream Output ...
- 一些重要 Docker 命令的简单介绍
1. 拉取 Docker 镜像 由于容器是由 Docker 镜像构建的,首先我们需要拉取一个 docker 镜像来开始.我们可以从 Docker Registry Hub 获取所需的 docker 镜 ...
- python之基本内容
这里提供在使用python进行开发中常使用到的方法技巧,如有不对欢迎批评指正. 要点:开发中类.变量特性查询,类型就是类,断言的使用,深浅复制判断等 python脚本文件是使用UTF-8编码的,所以在 ...
- Spring源码情操陶冶-AbstractApplicationContext#postProcessBeanFactory
阅读源码有利于陶冶情操,承接前文Spring源码情操陶冶-AbstractApplicationContext#prepareBeanFactory 约定:web.xml中配置的contextClas ...
- java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
今天使用hql语句的时候,遇到了一个这样的bug,修改的方法是
- NOIP2011玛雅游戏
闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...
- 两百条微信小程序跳坑指南(不定时更新)
微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...
- Oracle 11g RAC 修改各类IP地址
Oracle 11g RAC 修改各类IP地址 首先,我们都知道Oracle 11g RAC中的IP主要有:Public IP.VIP.SCAN VIP.Private IP这几种. 一般这类改IP地 ...
- 怎么关闭wps热点?永久关闭wps右下角弹窗的方法!
wps热点总是开机或者开启WPS后在任务栏闪烁,影响心情,百度了一下找到的方法也过时了.我的是WIN10系统 所以自己摸索了一下,找到了解决办法.其实还是用空白文件替换wps热点的.exe文件,只是这 ...