再起航,我的学习笔记之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天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 我们 ...
随机推荐
- 奔跑在Docker上的Spark
转自:马踏飞燕--奔跑在Docker上的Spark 目录 为什么要在Docker上搭建Spark集群 网络拓扑 Docker安装及配置 ssh安装及配置 基础环境安装 Zookeeper安装及配置 H ...
- 初次入坑jade模板引擎(一)
最近由于工作需要全栈开发,nodejs做后端,在写一个后台管理系统的时候,我一直在考虑用怎样的方式去写,尝试过依然采用前后端分离的结构.使用json数据进行数据交互的模式,但是尝试过才知道,真的很花时 ...
- Longest Palindromic Substring - 字符串中最长的回文字段
需求:Given a string S, find the longest palindromic substring in S. You may assume that the maximum le ...
- 51nod_1100:斜率最大
题目链接 斜率最大点对横坐标必相邻 #include <bits/stdc++.h> using namespace std; ; struct point { int x, y, pos ...
- linux自动化创建补丁
BUS #!/bin/sh #判断H5_BD_${BD_data}目录是否存在 BD_data=$(date +"%F") #当日打包多次的情况下,初始化补丁目录 if [ -d ...
- centos7 ssh免密码登录
单机测试 1,设置/etc/hosts 添加主机及ip 2,修改/etc/sysconfig/network NETWORKING=yesNETWORING_IPV6=yesHOSTNAME=mast ...
- TypeScript--变量及类型的那些事儿
变量(类型)声明 格式:关键字 变量名称:类型=值 (强类型) / 关键字 变量名称=值 例子: Array数组声明 Tuple元组类型 声明一个包含多类型的数组: Enum枚举类 ...
- (转)mybatis:动态SQL
概述:在mybatis中,动态语句是个非常强大和灵活的功能,并且动态语句可以放在sql的任何地方,利用该功能,我们可以写出非常灵活的代码.在mybatis的动态语句中常常可能会用到以下几个运算和逻辑判 ...
- hadoop环境中误删除tmp文件夹的恢复
情景描述: 种种原因,不小心把系统根目录中的tmp文件删除了!发现jps之后看不到 master主机上面的namenode,resourcemanager,secondarynamenode三个进程了 ...
- perl的安装和版本切换工具-perlbrew
setenv PERL /opt/perl5 --设置新perl的起始安装路径 curl -kL http://install.perlbrew.pl | bash source /opt/perl5 ...