javascript上的观察者模式

         观察者模式是众多软件设计模式中较为常用的一种模式。又称订阅发布模式。其主要原理是将多个观察者绑定在一个事件上,当一个事件触发时,通知绑定在上面的观察者,依次触发绑定的多个事件。

        这个模式在基于MV*框架的开发中有广泛的应用,可以有效的将数据层(Model)和视图层(view)分割开,以及不同的视图之间分割开,避免页面之间过度耦合。下面是我的一个例子:

<!—利用观察者模式,使三个块元素分别以不同方式隐藏 -->
<html>
    <head>
        <meta charset="utf-8">
        <title>张旭--观察者模式使用</title>
    </head>
    <body>
        <div id=‘div1‘ style=‘background-color: #123456;height:300px;width:100%‘></div>
        <div id=‘div2‘ style=‘background-color: #654321;height:300px;width:100%‘></div>
        <div id=‘div3‘ style=‘background-color: #321456;height:300px;width:100%‘></div>
        <script type="text/javascript" src=‘jquery-1.8.3.min.js‘></script>
        <script type="text/javascript">

Observe.prototype = {
            eventsArr:Observe,
            
            //绑定观察者
            bind: function(eventName,callback) {
            this.handers[eventName] || (this.handers[eventName]=[]);
            this.handers[eventName].push(callback);
            },
            //将触发的事件广播出去
            trigger: function(eventName) {
               for (var i = 0, len = this.handers[eventName].length;i<len; i++) {
                this.handers[eventName][i].apply(self);
                };
            },
            //取消绑定
            destory: function(eventName) {
               for (var i = 0, len = this.handers[eventName].length;i<len; i++) {
                this.handers[eventName].pop();
                };
            }
        }

        //创建一个实例
        observe = new Observe();

        分别将观察者绑定在“hide”事件上
        observe.bind("hide",function(){
            alert("hide All");
        });
        observe.bind("hide", function() {
          $(‘#div1‘).fadeOut("slow");
        });
        observe.bind("hide", function() {
          $(‘#div2‘).hide(‘slow‘,‘linear‘);
        });
        observe.bind("hide", function() {
          $(‘#div3‘).slideUp("slow");
        });
        //通过触发“hide”事件,广播给其他的观察者依次触发其他事件
        observe.trigger("hide");

</script>

</body>
</html>

       在这个例子中,首先通过定义一个新的对象,并给这个对象设置了注册bind()、广播trigger()、销毁distory()三个方法,接着通过建立一个对象的实例,将三个块元素隐藏的事件绑定在这个实例上,通过触发被绑定的事件,将触发绑定事件广播出去给绑定在上面的观察者,进而触发绑定在上面的事件。

      这样的设计模式的优点在于观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。

javascript上的观察者模式

时间: 2024-08-24 04:48:54

javascript上的观察者模式的相关文章

( 译、持续更新 ) JavaScript 上分小技巧(二)

考虑到文章过长,不便于阅读,这里分出第二篇,如有后续,每15个知识点分为一篇... #29 - 使用缓存的记忆让递归函数加速运行波非那切数列(Fibonacci sequence)想必大家都不陌生(针对学霸而言,在这之前本兽完全不知道这是个什么鬼,虽然经常会用到递归),我们可以在20秒内写出以下的函数: var fibonacci = function(n){ return n < 2 ? n : fibonacci(n-1) + fibonacci(n-2); } 它确实是运行了,但是效率并不

JavaScript设计模式之观察者模式(学习笔记)

设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切图.做少量交互效果的FE甚至可能不会用到,但是当你开始使用Angular/Backbone等框架的时候,就无法避免设计模式.MVC/MVVM这些东西了(反正我是伤脑筋). 我学设计模式是刚开始接触编程大概三个月的时候,看一本书<大话设计模式>,里面用C#语言来写,我很无语,因为强类型的编程语言对于

Javascript设计模式之观察者模式

首先说一下观察者模式的应用场景 观察者的使用场合就是:当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式.(Tom大叔) 具体说一下这个观察者模式,就是一个发报纸的过程.我们订阅了报纸,在报社的数组里加上我们的名字(不仅是名字了是一个带我们名字的处理函数),这是订阅事件:报社才不管你订没订报纸,他只管给他数组里的人发报纸:我们在编码的时候只监听发报纸的事件,订不订报纸,谁订报纸,都是你的事,就不在放在监听的事件里了,于是就有了减少监听的优化:

七牛C#语言搭建javascript上传--包含后端请求token(前端javascript+后端c#)

Qiniu 七牛问题解答 很多用户反应不会自己搭建javascript的工程,因为涉及到请求服务端的token,在我的博客中包含了(javascript前端+后端java)的工程demao. 问题解决方案 点击这里写在完整的工程 1,首先你要打开你的vs,建一个asp.net的web项目.然后在你的网站建一个asp的web页面,拷贝以下代码进去: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=

JavaScript 上传文件

1.上传base64图片 #upload.html <input type="file"> #js代码 $(function(){ //创建FileReader对象 var reader = new FileReader(); //绑定onload事件 reader.onload = function(e){//当reader执行readAsDataURL完毕,读取数据成功后,就会触发load事件 console.log(e.target.result);//target的

IE &amp;&amp; FireFox在javascript上的区别

内容来源网络,学习: 大致看了一遍,其中有部分不太确定,2014.06.05,现在FF和IE的版本都很高,找不到低版本的FF,因此其中部分JS方法可能现在已经支持.后续会纠错,如果被你先发现了,欢迎评论纠错. 参考来源:百度空间 ------------------------------------------------------------------------------------ 测试代码时,发现不少IE可以运行的ajax,但在FF中报错. IE和Firefox(火狐)在Java

[Js高手之路第一部]JavaScript上百例实战【新版】_1 js代码三种书写方式

小结: javascript使用的3种方式: 1,页面script方式 2,行间事件触发 3,外部引入方式 1,页面script方式 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <script> 7 alert(1); 8 <

[Js高手之路第一部]JavaScript上百例实战【新版】_3 javascript变量的类型

JavaScript 数据类型 字符串.数字.布尔.数组.对象.Null.Undefined 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 <script> 7 //变量的类型由 变量的值来决定 8 // 弱类型语言 9 10 //字符串类型, 用引

JavaScript上传大文件的三种解决方案

众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹上传,要求:服务端保留层级结构,支持10w级别的文件夹上传. 大文件上传及断点续传,要求:支持50G级的单个文件上传和续传.续传要求:在刷新浏览器后能够续传上传,在重启浏览器后能够继续上传上(关闭浏览器后重新打开),在重启电脑后能够继续上传. 支持PC端全平台,Windows,Mac,Linux 浏