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): 在不改变原对象的基础上,通过对其进行过包装拓展(添加属性高或者方法)使原有对象可以满足用户的更复杂需求. 如果现在我们有个需求,需要做一个提交表单,当我 ...
随机推荐
- 【WCF】WCF中的InstanceContext与ConcurrencyMode【转】
一.前言 最近忙于公司的在线升级项目,一个人要负责公司四大产品的在线升级,这四个产品是在Revit中以插件形式存在的,目前基于WCF来实现.等客户总量突破5万了,再重新用socket实现. 由于有服务 ...
- WCF 数据数据 DataTable
一般在WCf数据大数据是 List集合 或者 Json. public DataTable GetProperitybyModelCode(string modelCode) { using (var ...
- Oracle函数-DECODE
DECODE翻译为解码或译码,因为它可以把查询结果翻译成令用户容易理解的内容. 语法: expr: 表达式 search:搜索值 result:结果值 default:默认值 DECODE函数的第一个 ...
- 基于CkEditor实现.net在线开发之路(4)快速布局,工具箱,模板载入,tab选项卡简单说明与使用
上一章给常用的from表单控件属性页面,进行了简单说明和介绍,但是由于是在网页中做界面设计,操作肯定没有桌面应用程序方便,便捷,为了更方便的布局与设计,今天我主要说一下快速布局,工具箱,tab选项卡, ...
- sqlHelper做增删改查,SQL注入处理,存储值,cookie,session
一.存储值 eg:登录一个页面,在进入这个页面之前你怎么知道它登没登录呢?[在登录成功之后我们把状态保存起来] 存储值得方式有两种,一种是cookie,一种是session 1.1区别: 代码: if ...
- 关于xamarin.forms在MVVM情况下如何DisplayActionSheet
最近一直在研究Xmarin.forms,碰到了一个棘手的问题,就是在MVVM的情况下如何在ViewModel中去使用DisplayActionSheet,然而我使用的是XAML模式,也就是说,只有在后 ...
- yii的入口文件index.php中为什么会有这两句
yii的应用模板中,index.php中 前面会有这两句 <?php // comment out the following two lines when deployed to produc ...
- gson笔记 解析json数据
gson中负责json数据解析的类是JsonReader. Json格式有两种结构,一种是对象(键值对的组合,无序),另外一种是数组(值的有序集合). 因此针对这两种格式,JsonReader提供了不 ...
- 《Ext JS模板与组件基本知识框架图----模板》
最近在整理Ext JS的模板和组件,在参考<Ext JS权威指南>,<Ext JS Web应用程序开发指南>,<Ext JS API>等相关书籍后才写下这篇< ...
- 关于Java数组
今天,我们将要谈到的是Java里的数组 数组是一种容器,它是一些相同类型元素的集合.我们可以用数组,去存储一些相同类型的数据,比如,整数,浮点数,字符,...事实上,数组甚至可以用来存储同一个类的多个 ...