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): 在不改变原对象的基础上,通过对其进行过包装拓展(添加属性高或者方法)使原有对象可以满足用户的更复杂需求. 如果现在我们有个需求,需要做一个提交表单,当我 ...
随机推荐
- 通过SQL Server自定义数据类型实现导入数据
写在前面 在看同事写的代码时看到了SQL Server中可以自定义数据类型,而且定义的是DataTable类型的数据类型. 后我想起了以前我们导入数据时要么是循环insert写入,要么是SqlBulk ...
- 关于一道PHP面试题的解法
参照一个int型数组,如int[] a1=new int[]{10,9,10,20,15,3,9,8,7,1,1},编写一个方法,要求输出不重复,且降序的拼接字符串(连接字符用逗号),如上数组,输出的 ...
- N[开源].NET CORE与MySql更配, MySqlSugar ORM框架 3.x
MySqlSugar 3.X API 作为支持.NET CORE 为数不多的ORM之一,除了具有优越的性能外,还拥有强大的功能,不只是满足你的增,删,查和改.实质上拥有更多你想像不到的功能,当你需要实 ...
- [Web API] Web API 2 深入系列(7) Model绑定(下)
目录 ModelBinder ModelBinderProvider 不同类型的Model绑定 简单类型 复杂类型 其他类型 ModelBinder ModelBinder是Model绑定的核心. p ...
- 初识nginx之第一个demo
商城项目做了一个多月了,想到必须用到负载均衡,简单了解了一下nginx,首先分享第一个demo,五月份上线后,会继续分享一系列相关知识. 在nginx根目录下,用了一个园友的批处理文件nginx.ba ...
- 微信JSApi支付~订单号和微信交易号
返回目录 谈谈transactionId和out_trade_no 前一篇微信JSApi支付~坑和如何填坑文章反映不错,所以又写了个后篇,呵呵. 每个第三方在线支付系统中都会有至少两类订单号,其一为支 ...
- C标准头文件<signal.h>
信号即异常,或者理解为中断,一个进程接收到一个信号,如果没有处理机制,就会按照默认的处理方式进行处理,而默认的处理方式通常是终止当前进程或忽略该信号.当然,程序也可以编写相应的处理信号的函数,一旦接收 ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- Web测试介绍一 UI测试
随着Web 2.0技术的迅速发展,许多公司都开发了一些基于Web的网站服务,通常在设计开发Web应用系统的时候很难模拟出大量用户同时访问系统的实际情况,因此,当Web网站遇到访问高峰时, ...
- HTML5中使用图片传递密文
上面的两张图片中,你能看出有什么不同吗? 右图使用 html5 canvas api 中的 getImageData 和 putImageData 函数嵌入了一段文字. 道理很简单,getImageD ...