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): 在不改变原对象的基础上,通过对其进行过包装拓展(添加属性高或者方法)使原有对象可以满足用户的更复杂需求. 如果现在我们有个需求,需要做一个提交表单,当我 ...
随机推荐
- 为SharePoint 站点添加通知
作为思想.内容的共享型产品,SharePoint 不出意外的成为其中最好用的产品之一,想想平时在公司中接到通知并了解通知内容是件很平常的事情,那让这种平常的事情进入到SharePoint中可以通过如下 ...
- 编译器出现conflicting types for 某某的错误原因总结
直译就是xxxx 发生了一种冲突!比如今天发现的这个错误,实属低级! 本次错误的原因是:函数没有先声明,便写在了主函数后面!应该是先声明,后定义,如果只有定义,则定义必须写在主函数上方.通过查资料,有 ...
- spring整合hibernate的详细步骤
Spring整合hibernate需要整合些什么? 由IOC容器来生成hibernate的sessionFactory. 让hibernate使用spring的声明式事务 整合步骤: 加入hibern ...
- Android之圆形头像裁切
PS:今天项目测试组发现,百度地图定位的数据坐标位置是正确的,但是显示的数据是错误的.最后查来查去发现,那个商厦在百度地图上根本就没有那条数据,这让我如何显示,当初就推崇使用高德地图定位,上面的数据量 ...
- mysql数据库去重复
参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单.但动手写起来却并不是那么容易.面试的时候 ...
- Xamarin Studio在Mac环境下的配置和Xamarin.iOS常用控件的示例
看过好多帖子都是Win环境装XS,Mac只是个模拟器,讲解在Mac环境下如何配置Xamarin Studio很少,也是一点点找资料,东拼西凑才把Xamarin Studio装在Mac上跑起来,如下: ...
- discuz X3.1 关于分表 和 分表数据迁移
// *********** 关于读取分表的数据*********** { // forum_thread 分表代码片段 -- 帖子列表 { // 定位某个板块的帖子落在哪个表(forum_threa ...
- 【nodejs笔记3】Express基本用法,和路由控制,和模板渲染ejs
1. 路由控制的工作原理 //routes/index.js中的代码//访问主页时,调用ejs模板引擎,渲染index.ejs模板文件,生成静态页面,并显示在浏览器中.router.get('/', ...
- Hibernate-chapter two
又见面啦!!!经过上一章的学习,我们大概对Hibernate框架有所了解.接下来进入我们的第二阶段——实战! ======准备数据库====== 这里使用MySQL作为示范. 创建一个名为Hibern ...
- 玩转 H5 下拉上滑动效果
在APP中我们经常会在页面下拉时看到一些动效,例如下拉图片跟随放大.下拉刷新出现loading动画等,这个交互细节在各个主流APP以及手机原生系统中随处可见,能为APP增添个性亮点. 一.背景 在我们 ...