装饰者模式笔记
 在不改变原对象的基础上,
 通过对其进行包装拓展(添加属性或方法)使原有对象可以满足用户的更复杂要求。
 需求不是一成不变的,需求会不断改进,以增强用户体验
 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-装饰者模式的更多相关文章

  1. 轻松掌握:JavaScript装饰者模式

    装饰者模式 在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但继承的方式会带来问题:当父类改变时,他的所有子类都将随之改变. 当JavaScript脚本运行时,在一个对象中(或他的原型上)增 ...

  2. javascript装饰器模式

    装饰器模式 什么是装饰器 原名decorator 被翻译为装饰器 可以理解为装饰 修饰 包装等意 现实中的作用 一间房子通过装饰可以变得更华丽,功能更多 类似一部手机可以单独使用 但是很多人都愿意家个 ...

  3. JavaScript——装饰者模式

    今天打算开始系统的学习设计模式,虽然之前有看过<大话设计模式>但是没能够静下心来写学习笔记导致很多内容都只是有一个概念而不会去应用.这次要记下学习的过程.接下来进入主题. 何为设计模式?设 ...

  4. JavaScript装饰者模式

    这里我们通过需求逐渐引出装饰者模式. 下面是一个关于几代汽车的不同逐渐体现装饰者模式的. 首先,我们先引入一个接口文件----目的为检验实现类是否完全实现接口中的方法,代码如下, //定义一个静态方法 ...

  5. JavaScript 装饰者模式(this运用)

    例: function ConcreteClass() { this.performTask = function () { this.preTask(); console.log('doing so ...

  6. Javascript设计模式之装饰者模式详解篇

    一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点: 1. 在不改 ...

  7. 【读书笔记】读《JavaScript设计模式》之装饰者模式

    一.定义 装饰者模式可用来透明地把对象包装在具有同样接口的另一个对象之中.这样一来,你可以给一个方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者对象是一种更灵活的选择(装 ...

  8. javascript设计模式学习之十五——装饰者模式

    一.装饰者模式定义 装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.这种为对象动态添加职责的方式就称为装饰者模式.装饰者对象和它所装饰的对象拥有一致的接口,对于用 ...

  9. JavaScript高级---装饰者模式设计

    一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...

  10. 再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)

    装饰者模式 装饰者模式(Decorator): 在不改变原对象的基础上,通过对其进行过包装拓展(添加属性高或者方法)使原有对象可以满足用户的更复杂需求. 如果现在我们有个需求,需要做一个提交表单,当我 ...

随机推荐

  1. unbuntu14.04 安装nginx配置

    记录一下linux下安装nginx的所需要的配置. 首先从 nginx官网 下载所需要的版本,复制链接,执行 wget http://nginx.org/download/nginx-1.8.0.ta ...

  2. Javascript的无new构建

    看jquery源代码第一步的时候,对于jquery对象的创建就看的云里雾里,琢磨半天终于有点感觉了,在此记录下 第一种方式: var A = function(){ return A.prototyp ...

  3. Oracle Tuning 基础概述01 - Oracle 常见等待事件

    对Oracle数据库整体性能的优化,首先要关注的是在有性能问题时数据库排名前几位等待事件是哪些.Oracle等待事件众多,随着版本的升级,数量还在不断增加,可以通过v$event_name查到当前数据 ...

  4. 【JUC】JDK1.8源码分析之ReentrantLock(三)

    一.前言 在分析了AbstractQueuedSynchronier源码后,接着分析ReentrantLock源码,其实在AbstractQueuedSynchronizer的分析中,已经提到过Ree ...

  5. [Java IO]06_JSON操作

    6.1 JSON 知识背景 6.1.1 JSON 简介 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法.类似 ...

  6. HTML特殊符号汇总

    较常用的飘黄处理了 ´ ´ © © > > µ µ ® ® & & ° ° ¡ ¡   » » ¦ ¦ ÷ ÷ ¿ ¿ ¬ ¬ § § • • ½ ½ « « ¶ ¶ ¨ ...

  7. WebView JS与RN进行通讯

    RN0.37终于官方增加了WebView与React Native的通讯,之前一真使用的是第三方控件React-Native-WebView-Bridge,但不是知道怎么回事这个第三方控件喊了很长时间 ...

  8. jquery的事件命名空间详解

    jquery现在的事件API:on,off,trigger支持带命名空间的事件,当事件有了命名空间,就可以有效地管理同一事件的不同监听器,在定义组件的时候,能够避免同一元素应用到不同组件时,同一事件类 ...

  9. Ubuntu实现树莓派交叉编译

    一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时 ...

  10. jquery easyui使用(二)······可折叠面板动态加载无效果

    先上代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"& ...