javascript-装饰者模式
装饰者模式笔记
在不改变原对象的基础上,
通过对其进行包装拓展(添加属性或方法)使原有对象可以满足用户的更复杂要求。
需求不是一成不变的,需求会不断改进,以增强用户体验
demo实例:对输入框添加focus与blur事件
这个实例中,输入框只有一两个时,新添需求不觉得麻烦,当有许多输入框都要新添需求时,实现会很麻烦,而使用装饰者模式却能很简单完成
html代码
<style>
#container{width: 800px;margin:100px auto;}
input{margin-right:5px;}
span{font-size: 12px;color:#999;}
</style>
<div id="container">
<input name="uname" id="uname" value="" placeholder="请输入用户名"/><span id="uname_demo_text">用户名以字母开头,由字母、数字、下划线组成,长度3-16位</span><span id="uname_warn_text"></span><br/><br/>
<input name="phone" id="phone" value="" placeholder="请输入手机号码"/><span id="phone_demo_text">手机号码以13、14、15、18开头,由数字组成,长度11位</span><span id="phone_warn_text"></span>
</div>
原有事件功能
var uname=document.getElementById("uname");
var phone=document.getElementById("phone");
var unameDemoText=document.getElementById("uname_demo_text");
var unameWarnText=document.getElementById("uname_warn_text");
var phoneDemoText=document.getElementById("phone_demo_text");
var phoneWarnText=document.getElementById("phone_warn_text");
uname.onblur = function(){
var nameValid=/^[a-zA-Z][a-zA-Z0-9_]{5,17}$/i;
if(!nameValid.test(uname.value)){
unameWarnText.innerHTML="用户名不符合填写规则";
}else{
unameWarnText.innerHTML="用户名符合填写规则";
}
}
phone.onblur = function(){
var phoneValid=/^1(3|4|5|8)\d{9}$/i;
if(!phoneValid.test(phone.value)){
phoneWarnText.innerHTML="手机号码不符合填写规则";
}else{
phoneWarnText.innerHTML="手机号码符合填写规则";
}
}
装饰者
/*装饰者*/
var decorator=function(input,focusFn,blurFn){
//获取事件源
var input=document.getElementById(input);
//判断事件源是否绑定focus事件
if(typeof input.onfocus === 'function'){
//缓存事件源原有回调函数
var oldFocusFn = input.onfocus;
//为事件源定义新的事件
input.onfocus = function(){
//事件源原有回调函数
oldFocusFn();
//新增回调函数
focusFn();
}
}else{
//事件源未绑定事件,直接为事件源添加新增回调函数
input.onfocus = focusFn;
}
//判断事件源是否绑定blur事件
if(typeof input.onblur === 'function'){
//缓存事件源原有回调函数
var oldBlurFn = input.onblur;
//为事件源定义新的事件
input.onblur = function(){
oldBlurFn();
blurFn();
}
}else{
//事件源未绑定事件,直接为事件源添加新增回调函数
input.onblur = blurFn;
}
}
新增回调函数
decorator('uname',function(){
//新增focus回调函数
unameDemoText.style.display="none";
},function(){
//新增blur回调函数
unameWarnText.style.color="#f03";
});
decorator('phone',function(){
//新增focus回调函数
phoneDemoText.style.display="none";
},function(){
//新增blur回调函数
phoneWarnText.style.color="#f03";
});
代码测试:



优化装饰者方法
/*优化装饰者方法*/
var decorator = function(id,type,fn){
var dom = typeof id === 'string' ? document.getElementById(id) : id;
//判断事件源是否绑定事件
if(typeof dom[type] === 'function'){
//缓存事件源原有回调函数
var oldFn = dom[type];
//为事件源定义新的事件
dom[type] = function(){
//事件源原有回调函数
oldFn();
//新增回调函数
fn();
}
}else{
//事件源未绑定事件,直接为事件源添加新增回调函数
dom[type] = fn;
} };
调用装饰者方法
1 decorator('uname','onfocus',function(){
//新增focus回调函数
unameDemoText.style.display="none";
});
decorator('uname','onblur',function(){
//新增focus回调函数
unameWarnText.style.color="#f03";
});
decorator('phone','onfocus',function(){
//新增focus回调函数
phoneDemoText.style.display="none";
});
decorator('phone','onblur',function(){
//新增focus回调函数
phoneWarnText.style.color="#f03";
});
浏览器显示效果同上
javascript-装饰者模式的更多相关文章
- 轻松掌握:JavaScript装饰者模式
装饰者模式 在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但继承的方式会带来问题:当父类改变时,他的所有子类都将随之改变. 当JavaScript脚本运行时,在一个对象中(或他的原型上)增 ...
- javascript装饰器模式
装饰器模式 什么是装饰器 原名decorator 被翻译为装饰器 可以理解为装饰 修饰 包装等意 现实中的作用 一间房子通过装饰可以变得更华丽,功能更多 类似一部手机可以单独使用 但是很多人都愿意家个 ...
- JavaScript——装饰者模式
今天打算开始系统的学习设计模式,虽然之前有看过<大话设计模式>但是没能够静下心来写学习笔记导致很多内容都只是有一个概念而不会去应用.这次要记下学习的过程.接下来进入主题. 何为设计模式?设 ...
- JavaScript装饰者模式
这里我们通过需求逐渐引出装饰者模式. 下面是一个关于几代汽车的不同逐渐体现装饰者模式的. 首先,我们先引入一个接口文件----目的为检验实现类是否完全实现接口中的方法,代码如下, //定义一个静态方法 ...
- JavaScript 装饰者模式(this运用)
例: function ConcreteClass() { this.performTask = function () { this.preTask(); console.log('doing so ...
- Javascript设计模式之装饰者模式详解篇
一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...
- 【读书笔记】读《JavaScript设计模式》之装饰者模式
一.定义 装饰者模式可用来透明地把对象包装在具有同样接口的另一个对象之中.这样一来,你可以给一个方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者对象是一种更灵活的选择(装 ...
- javascript设计模式学习之十五——装饰者模式
一.装饰者模式定义 装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.这种为对象动态添加职责的方式就称为装饰者模式.装饰者对象和它所装饰的对象拥有一致的接口,对于用 ...
- JavaScript高级---装饰者模式设计
一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...
- 再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)
装饰者模式 装饰者模式(Decorator): 在不改变原对象的基础上,通过对其进行过包装拓展(添加属性高或者方法)使原有对象可以满足用户的更复杂需求. 如果现在我们有个需求,需要做一个提交表单,当我 ...
随机推荐
- 如何设置UILabel中的字体的间距
cell.teacherDescriptionLabel.text = content; cell.teacherDescriptionLabel.textAlignment = NSTextAlig ...
- 【JUC】JDK1.8源码分析之LockSupport(一)
一.前言 最开始打算分析ReentrantLock,但是分析到最后,发现离不开LockSuport的支持,所以,索性就先开始分析LockSupport,因为它是锁中的基础,是一个提供锁机制的工具类,所 ...
- 用MVC做支付宝手机网页支付问题
支付宝支付接口手机网页支付 从官网扒下来的demo阿里做得还是相当不错的,只要参数改正确了基本上都是能跑通,WebForm的没什么大问题,这次要讲的主要是几个要注意的问题,因为是用MVC来做. 1.要 ...
- 我的angularjs源码学习之旅1——初识angularjs
angular诞生有好几年光景了,有Google公司的支持版本更新还是比较快,从一开始就是一个热门技术,但是本人近期才开始接触到.只能感慨自己学习起点有点晚了.只能是加倍努力赶上技术前线. 因为有分析 ...
- linux源码分析(二)-启动过程
前置:这里使用的linux版本是4.8,x86体系. 这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 的学习笔记. ...
- LINQ to SQL语句(11)之Update
说明:更新操作,先获取对象,进行修改操作之后,直接调用SubmitChanges()方法即可提交.注意,这里是在同一个DataContext中,对于不同的DataContex看下面的讲解. 1.简单形 ...
- 使用SignalR实现即时通讯功能
教程简介 SignalR的好处是可以让多个客户端之间进行互动,比如这篇教程就展示了当你在页面上拖动矩形方块的同时,其它打开这个页面的用户也将会看到你拖动的轨迹以及最终的结果,当然他们也可以通过拖动该方 ...
- jQuery弹出美女大图片
效果:http://hovertree.com/texiao/jqimg/2/ 效果图: 下载:http://hovertree.com/h/bjaf/jdaqepet.htm HTML代码: < ...
- C#基础-文件夹复制与删除
代码来源:http://blog.163.com/u_tommy_520/blog/static/20406104420147493933662/ 最近做MVC网站时刚好用到,用以提供一个完整的文件夹 ...
- 使用NPOI组件完成的Excel导出导入(附源代码,测试通过)
最近遇到一个Excel导入导出的问题,要支持winform和webform,这里我是一个认真严谨的coder,所以决定把这个记录下来!和大家一起分享一下!如果需要的同学可以下载哦! 对于NPOI这个组 ...