`

事件设计模式

阅读更多
1. 事件设计概述

    事件机制可以是程序逻辑更加清晰可见,在JavaScript中很多对象都有自己的事件,如:button有onclick事件,selcet有onchange事件。对于我们自己设计的类,是否也可以有事件机制呢?答案是肯定的。我们可以通过事件机制,将类设计为独立的模块,从而使其可以通过事件与外通信,提高程序的开发效率。

2. 不带参数的事件设计模式

    最简单的一种模式是将一个类的方法成员定义为事件,可以借助JavaScript的基本语法来实现,通常是一个空的方法。例如:
<script language="javascript" type="text/javascript" >   
  
function User(){   
}   
User.prototype={   
    show:function(){   
        this.onShow();//触发onShow事件   
    },   
    onShow:function(){}//定义事件接口   
}   
var obj = new User();   
//创建obj的onShow事件处理程序   
obj.onShow = function(){   
    alert("事件触发了");   
}   
//调用obj的show方法   
obj.show();   
</script>  

obj.onShow 方法在类的外部被定义,在类的内部方法 show() 中被调用,这就实现了事件机制。

    此设计模式应用起来简单,但有其有以下缺点:

不能够给事件处理程序传递参数,原因是我们是在 show() 这个内部方法中调用事件处理程序的,无法知道外部的参数。
每个事件接口只能绑定一个事件处理程序,而内部方法则可以使用 attachEvent 或 addEventListener 方法绑定多个处理程序。
3. 给事件处理程序传递参数

    给事件处理程序传递参数不仅是自定义事件中存在的问题,也是系统内部对象的事件机制中存在的问题,因为事件机制仅传递一个函数名称,不带有任何参数信息,所以无法传递参数进去。例如:
<script language="javascript" type="text/javascript" >   
function User(){   
}   
User.prototype={   
    show:function(){   
        this.onShow();//触发onShow事件   
    },   
    onShow:function(){}//定义事件接口   
}   
var obj = new User();   
//创建obj的onshow事件处理程序   
function objOnShow(userName){   
    alert("hello,"+userName);   
}   
//定义username变量   
var userName = "plkong";   
//绑定obj的onshow事件   
obj.onShow = objOnShow;//无法将userName这个变量传递进去   
obj.show();   
</script>  


<script language="javascript" type="text/javascript" >
function User(){
}
User.prototype={
show:function(){
this.onShow();//触发onShow事件
},
onShow:function(){}//定义事件接口
}
var obj = new User();
//创建obj的onshow事件处理程序
function objOnShow(userName){
alert("hello,"+userName);
}
//定义username变量
var userName = "plkong";
//绑定obj的onshow事件
obj.onShow = objOnShow;//无法将userName这个变量传递进去
obj.show();
</script>  上面的程序是无法传递参数进去的,为了解决这个问题,我们可以从相反的思维方式去考虑问题。不考虑怎么把参数传递进去,而是考虑如何构建一个无需参数的事件处理程序。我们看看先看看下面的函数:
/* 将参数的函数封装为无参数的函数 */  
    function createFunction(obj, strFunc)
    {   
	    var args = [];//定义args用于存储传递给事件处理程序的参数   
	    if(!obj) obj = window;//如果是全局函数则obj = window;   
	    //得到传递给事件处理程序的参数   
	    for( var i = 2; i<arguments.length; i++)   
	        args.push(arguments[i]);   
	    //用无参函数封装事件处理程序的调用   
	    /*  
	    JavaScript为函数对象定义了两个方法:apply 和 call, 它们的作用都是函数绑定到另外一个对象上运行。  
	    */  
	    return function()
	    {   
        	obj[strFunc].apply(obj, args);//将参数传递给指定的事件处理程序   
        }   
	}   

该方法将一个有参数的函数封装为一个无参数的函数,不仅对全局函数适用,作为对象方法存在的函数也是适用的。该方法首先接收两个参数:obj 和 strFunc ,obj 表示事件处理程序所在的对象; strFunc 表示事件处理程序的名称。程序中还利用了arguments对象(arguments是传递给函数的隐含参数,arguments对象存储的是实际传递给函数的参数,而且不局限与函数声明所定义的形参列表。关于arguments对象可以参考其他资料)处理第二个参数以后的隐式参数,即未定义为形参的参数,

    例如:事件处理程序

    someObject.eventHandler = function(_arg1, _arg2){

                   //事件处理代码


}

    应该调用:creatFunction(someObject, "eventHander", arg1, arg2);

    这样就返回一个无参数的函数,在返回的函数中已经包括了传递进去的参数。如果是全局函数作为事件处理程序,事实上它是window 对象的一个方法,所以可以传递window对象作为obj参数,为了更清晰一点,也可以指定obj为null, creatFunction函数内部会自动认为该函数是全局函数,从而自动吧obj赋值为window。最后完成的代码如下:
function User()
	{   
	}   
	User.prototype=
	{   
	    show:function()
	    {   
	        this.onShow();//触发onShow事件   
	    },   
	    onShow:function(){}//定义事件接口   
	}   
	var obj = new User();   
	//创建obj的onshow事件处理程序   
	function objOnShow(userName)
	{   
	    alert("hello,"+userName);   
	}   
	//定义username变量   
	var userName = "plkong";   
	//绑定obj的onshow事件   
	//obj.onShow = objOnShow;//无法将userName这个变量传递进去   
	obj.onShow = createFunction(null, "objOnShow", userName);   
	obj.show();  
分享到:
评论
1 楼 cheaizheng 2008-07-17  
 

相关推荐

    24种设计模式以及混合设计模式

    1. 在Web开发中,Spring框架就广泛应用了设计模式,如工厂模式用于创建Bean,单例模式保证每个Bean只有一个实例,观察者模式用于事件驱动编程,策略模式用于实现AOP(面向切面编程)。 2. 在游戏开发中,状态模式常...

    Head First 设计模式 +Java设计模式(第2版)

    《Head First 设计模式》与《Java设计模式(第2版)》是两本非常重要的IT书籍,专注于软件开发中的设计模式。设计模式是解决软件设计中常见问题的经验总结,它们提供了一种标准的方法来处理特定场景下的问题,使得代码...

    设计模式(包含5个设计模式)含源代码报告.rar

    这个压缩包文件"设计模式(包含5个设计模式)含源代码报告.rar"显然是一份宝贵的资源,它涵盖了五个核心的设计模式,并附带了详细的类图、源代码以及文档报告,这对于学习和理解设计模式至关重要。 首先,我们要探讨...

    委托、事件与Observer设计模式

    委托、事件和Observer设计模式是面向对象编程中的关键概念,特别是在C#中有着广泛的应用。本文将深入探讨这三个概念,并通过实例帮助初学者理解和掌握它们。 首先,让我们从委托(Delegate)开始。委托在C#中可以被...

    新版设计模式手册 - C#设计模式(第二版)

    《新版设计模式手册 - C#设计模式(第二版)》是一部深入探讨C#编程中设计模式的权威指南,尤其适合已经有一定C#基础并希望提升软件设计能力的开发者阅读。设计模式是解决软件开发中常见问题的经验总结,是软件工程的...

    设计模式之美——教你写出高质量代码

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式...

    c嵌入式设计模式

    状态机设计模式在嵌入式系统中也占据重要地位,因为很多嵌入式设备需要根据外部事件或内部状态变化来调整行为。书中介绍了状态机相关的模式,如单事件接收器模式、多事件接收器模式、状态表模式等,用以处理设备状态...

    委托和事件-观察者设计模式

    总结,委托和事件是C#中实现观察者设计模式的重要工具。委托允许我们将方法作为数据传递,而事件则封装了这些委托,确保了对象间的通信是安全和可控的。观察者设计模式在构建响应式和实时系统中扮演着关键角色,使得...

    23种设计模式(C++).pdf

    《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》是一本深入探讨软件设计模式的书籍,它涵盖了创建型、结构型和行为型三种主要类型的23个经典设计模式,并提供了C++语言的实现代码。设计模式是软件工程中的...

    设计模式——刘伟

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...

    实例解析labview 设计模式

    本篇文章将深入探讨三种重要的LabVIEW设计模式:生产消费者模式、事件状态机和状态机模式。 ### 生产消费者模式 生产消费者模式是一种处理并发和数据流控制的设计模式。在这种模式中,生产者VI创建数据并将其放入...

    C#面向对象设计模式纵横谈 12种设计模式

    在编程领域,设计模式是解决常见问题的经过验证的、可重用的解决方案。C#作为面向对象的语言,设计模式的应用对于开发高效、可维护的软件至关重要。本篇将深入探讨12种核心的设计模式,它们是:单例模式、工厂模式、...

    java设计模式pdf

    ### Java设计模式详解 #### 一、背景与概念 在软件工程领域,设计模式是一种用于解决常见问题的可重用解决方案。《Java设计模式PDF》是一本由James W. Cooper编写的经典书籍,该书详细介绍了Java编程语言中的设计...

    软件设计模式作业+答案

    软件设计模式和软件体系结构知识点总结 software design patterns and software architecture knowledge points summary 创建型软件设计模式: 工厂模式(Factory Pattern):符合开闭原则,提供了一种创建对象的...

    软件设计模式--填空题+简答题(复习7).rar

    《软件设计模式--填空题+简答题(复习7).rar》这个压缩包文件是一个针对《软件设计模式与体系结构》课程的复习资料,重点涵盖了软件设计中的关键概念和实践。设计模式是软件工程中的一种最佳实践,它代表了在特定上...

    C#设计模式PDF 电子书

    《C#设计模式PDF 电子书》是一本专注于C#编程语言中设计模式的应用和解析的书籍,2005年04版意味着它在设计模式领域的应用尚处于早期阶段,但仍然具有很高的学习价值。设计模式是软件工程中经过实践验证的、解决常见...

    JavaScript 设计模式(高清扫描版本)- 张容铭

    JavaScript设计模式是由张容铭编著的一本关于JavaScript编程领域的重要参考书籍,主要探讨了如何在JavaScript编程中应用设计模式来提升代码质量和可维护性。设计模式是软件工程中的最佳实践,它们是针对常见问题的...

    c#几种常用的设计模式

    在软件开发中,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。C#作为.NET框架的主要语言,其开发者经常使用各种设计模式来提高代码的可读性、可维护性和可扩展性。以下是对标题和描述中提到的几...

    head设计模式+设计模式解析(第二版).rar

    《Head First 设计模式》与《设计模式解析(第二版)》是两本关于软件设计模式的重要书籍,它们深入浅出地介绍了设计模式这一核心编程概念。设计模式是经验丰富的软件开发人员在解决常见问题时所形成的通用解决方案...

    设计模式大作业.zip

    设计模式是软件工程中的一种最佳实践,用于解决在开发过程中常见的设计问题,提高代码的可重用性、可维护性和可扩展性。本作业涵盖了多种设计模式,包括结构型、行为型和创建型模式,旨在帮助学习者深入理解和应用...

Global site tag (gtag.js) - Google Analytics