javascript-装饰者模式

装饰者模式笔记
 在不改变原对象的基础上,
 通过对其进行包装拓展(添加属性或方法)使原有对象可以满足用户的更复杂要求。
 需求不是一成不变的,需求会不断改进,以增强用户体验
 demo实例:对输入框添加focus与blur事件
 这个实例中,输入框只有一两个时,新添需求不觉得麻烦,当有许多输入框都要新添需求时,实现会很麻烦,而使用装饰者模式却能很简单完成

html代码

1         <style>
2             #container{width: 800px;margin:100px auto;}
3             input{margin-right:5px;}
4             span{font-size: 12px;color:#999;}
5         </style>
6         <div id="container">
7             <input name="uname" id="uname" value="" placeholder="请输入用户名"/><span id="uname_demo_text">用户名以字母开头,由字母、数字、下划线组成,长度3-16位</span><span id="uname_warn_text"></span><br/><br/>
8             <input name="phone" id="phone" value="" placeholder="请输入手机号码"/><span id="phone_demo_text">手机号码以13、14、15、18开头,由数字组成,长度11位</span><span id="phone_warn_text"></span>
9         </div>

原有事件功能

 1             var uname=document.getElementById("uname");
 2             var phone=document.getElementById("phone");
 3             var unameDemoText=document.getElementById("uname_demo_text");
 4             var unameWarnText=document.getElementById("uname_warn_text");
 5             var phoneDemoText=document.getElementById("phone_demo_text");
 6             var phoneWarnText=document.getElementById("phone_warn_text");
 7             uname.onblur = function(){
 8                 var nameValid=/^[a-zA-Z][a-zA-Z0-9_]{5,17}$/i;
 9                 if(!nameValid.test(uname.value)){
10                     unameWarnText.innerHTML="用户名不符合填写规则";
11                 }else{
12                     unameWarnText.innerHTML="用户名符合填写规则";
13                 }
14             }
15             phone.onblur = function(){
16                 var phoneValid=/^1(3|4|5|8)\d{9}$/i;
17                 if(!phoneValid.test(phone.value)){
18                     phoneWarnText.innerHTML="手机号码不符合填写规则";
19                 }else{
20                     phoneWarnText.innerHTML="手机号码符合填写规则";
21                 }
22             }

装饰者

 1             /*装饰者*/
 2             var decorator=function(input,focusFn,blurFn){
 3                 //获取事件源
 4                 var input=document.getElementById(input);
 5                 //判断事件源是否绑定focus事件
 6                 if(typeof input.onfocus === ‘function‘){
 7                     //缓存事件源原有回调函数
 8                     var oldFocusFn = input.onfocus;
 9                     //为事件源定义新的事件
10                     input.onfocus = function(){
11                         //事件源原有回调函数
12                         oldFocusFn();
13                         //新增回调函数
14                         focusFn();
15                     }
16                 }else{
17                     //事件源未绑定事件,直接为事件源添加新增回调函数
18                     input.onfocus = focusFn;
19                 }
20                 //判断事件源是否绑定blur事件
21                 if(typeof input.onblur === ‘function‘){
22                     //缓存事件源原有回调函数
23                     var oldBlurFn = input.onblur;
24                     //为事件源定义新的事件
25                     input.onblur = function(){
26                         oldBlurFn();
27                         blurFn();
28                     }
29                 }else{
30                     //事件源未绑定事件,直接为事件源添加新增回调函数
31                     input.onblur = blurFn;
32                 }
33             }

新增回调函数

 1            decorator(‘uname‘,function(){
 2                 //新增focus回调函数
 3                 unameDemoText.style.display="none";
 4             },function(){
 5                 //新增blur回调函数
 6                 unameWarnText.style.color="#f03";
 7             });
 8             decorator(‘phone‘,function(){
 9                 //新增focus回调函数
10                 phoneDemoText.style.display="none";
11             },function(){
12                 //新增blur回调函数
13                 phoneWarnText.style.color="#f03";
14             });

代码测试:

时间: 2024-10-02 07:33:21

javascript-装饰者模式的相关文章

javascript装饰器模式

众所周知装饰器模式用于给对象在运行期间动态的增加某个功能,职责等.相较通过继承的方式来扩充对象的功能,装饰器显得更加灵活,首先,我们可以动态给对象选定某个装饰器,而不用hardcore继承对象来实现某个功能点.其次:继承的方式可能会导致子类繁多,仅仅为了增加某一个单一的功能点,显得有些多余了. 装饰器经典实现 首先来看看传统的decorator的实现吧!假设现有一类叫Person 的对象,该对象有个speak 方法.开始的时候Person 的对象只会说中文,现在我要让他说英文,那么可以这么做:

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

一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点:1. 在不改变原对象的原本结构的情况下进行功能添加.2. 装饰对象和原对象具有相同的接口,可以使客户以与原对象相同的方式使用装饰对象.3. 装饰对象中包含原对象的引用,即装饰对象是真正的原对象经过包装后的对象. 二.Javascript装饰者模式详解: 描述:装饰者模式中,可以在运行时动态添加附加功能到对象中.当

javascript设计模式学习之——装饰者模式

一.装饰者模式定义 装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.这种为对象动态添加职责的方式就称为装饰者模式.装饰者对象和它所装饰的对象拥有一致的接口,对于用户来说是透明的. 和java等语言不同的是,java的装饰器模式是给对象动态添加职责,javascript中,给对象添加职责的能力是与生俱来的,更侧重于给函数动态添加职责. 二.java中的装饰者模式实现 package com.bobo.shejimoshi.derector; public cl

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

一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生产对象,实现解耦. 桥接模式 : (桥接模式是一种既能把两个对象连接在一起,又能避免二者间的强耦合的方法.通过“桥”把彼此联系起来,同时又允许他们各自独立变化) 主要作用:主要作用表现为将抽象与其实现隔离开来,以便二者独立化. 组合模式 : (组合模式是一种专门为创建Web上的动态用户界面而量身制定

JavaScript设计模式与开发实践 装饰者模式

在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责.那么我们就可以使用装饰者模式.装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象. 装饰者模式能够在不改变对象自身的基础上,在程序运行期间给对象动态地添加职责. 一.模拟传统面向对象语言的装饰者模式 假设我们在编写一个飞机大战的游戏,随着经验值的增加,我们操作的飞机对象可以升级成更厉害的飞机,一开始这些飞机只能发射普通的子弹,升到第二级时可以发射导弹,升到第三级时可以发射原子弹. var

深入理解JavaScript系列(29):设计模式之装饰者模式

介绍 装饰者提供比继承更有弹性的替代方案. 装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数). 装饰者用于通过重载方法的形式添加新功能,该模式可以在被装饰者前面或者后面加上自己的行为以达到特定的目的. 正文 那么装饰者模式有什么好处呢?前面说了,装饰者是一种实现继承的替代方案.当脚本运行时,在子类中增加行为会影响原有类所有的实例,而装饰者却不然.取而代之的是它能给不同对象各自添加新行为.如下代码所示: //需要装饰的类(函数) f

javascript设计模式——装饰者模式

前面的话 在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责.那么可以使用装饰者模式.装饰者模式可以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象.本文将详细介绍装饰者模式 概念 在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活,还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之改变:另一方面,继承这种功能复用方式通常被称为“白箱复用”,“白箱”是相对可见性而言的,在继承方式中,超类的

《javascript设计模式》笔记之第十二章:装饰者模式

一.装饰者模式的作用 为函数或者对象的方法添加一些行为. 二.装饰者模式的原理 装饰者模式不是直接修改对象,而是以要修改的对象为基础,新建一个对象.不过这个新建的对象看起来就像在原对象的基础上增添了一些行为而已. 1.在对象中使用装饰者模式:就是把对象作为参数传入另一个构造函数中,然后这个构造函数里面就利用这个对象,创造出一个新的附加了一些行为的对象. 2.在函数中使用装饰者模式:把函数传入另一个函数中,然后返回一个以参数函数为基础的函数. 三.装饰者模式的简单例子 需求一: 我们要创建一个游戏

[设计模式] javascript 之 装饰者模式

装饰者模式说明 说明:通一个类来动态的对另一个类的功能对象进行前或后的修饰,给它辅加一些额外的功能; 这是对一个类对象功能的装饰,装饰的类跟被装饰的类,要求拥有相同的访问接口方法(功能),这在动态面向对象类里,一般以实现同一个接口(interface)来约束实现:装饰类的要有对被装饰类的引用,用于在装饰类的相应方法,调用相应被装饰类的方法,然后对其进行修饰: 场景举例: 1>. 比如我们生活中的穿衣服, 一件衬衣,一件西装外套,一条裤子,一条领带,一双漂亮的皮鞋; 每多穿一件,都是对前面一件或全

javascript 之 装饰者模式

装饰者模式说明 说明:通一个类来动态的对另一个类的功能对象进行前或后的修饰,给它辅加一些额外的功能; 这是对一个类对象功能的装饰,装饰的类跟被装饰的类,要求拥有相同的访问接口方法(功能),这在动态面向对象类里,一般以实现同一个接口(interface)来约束实现:装饰类的要有对被装饰类的引用,用于在装饰类的相应方法,调用相应被装饰类的方法,然后对其进行修饰: 场景举例: 1>. 比如我们生活中的穿衣服, 一件衬衣,一件西装外套,一条裤子,一条领带,一双漂亮的皮鞋; 每多穿一件,都是对前面一件或全