`
qbaty
  • 浏览: 97048 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浅谈javasript 观察者模式

阅读更多
对于密集型前端项目而言,业务的复杂程度会导致代码的耦合非常巨大,如何解耦和更加优雅的实现成为每个前端开发工程师的一个追求的目标。前端MVC,观察者模式,面向接口编程等等方案的提出都为我们解决了一些项目中常常碰到的实际问题。
之前winter大大吐槽过javascript 乱用设计模式的方式,我想观察者模式应用在相对独立的模块之间的解耦不属于此列。加上阿当也在他的微博上说到,会不会使用js的消息通知机制,可以区分js的老手和新手之分。由此可见观察者模式对于一些实际开发者而言还是比较讨好的。
那么具体什么是观察者模式,用通俗易懂的话说,就是模块之间的订阅以及广播。假设有A、B两个模块,相互不知道对方的存在(相互独立),B模块订阅了A模块的通知,这个假如时候A 由于状态的改变会发出广播,那么对模块A 订阅了这个状态的B就执行相应的逻辑。 整个订阅和通知的这个机制始终处于第三方,相当于一个接线员的工作,很像一个观察者,就是所谓的观察者模式。在wiki上有更加详细的解释,感兴趣的同学可以看看观察者模式wiki
这里引用wiki上的对观察者模式的用途阐述:

引用

  • 当抽象个体有两个相互依赖的层面时,封装这些层面在单独的物件内可将允许程序设计师单独地去变更重复使用这些物件,而不会产生两者之间的交互的问题。
  • 当其中一个物件的变更会影响其他物件,却又不知道多少物件必须被同时变更时。
  • 当物件应该有能力通知其他物件,又不应该知道其他物件的实际细节时

上面提到的观察者用途是否似曾相识?工作中的实际项目是否常见呢?我觉得答案是肯定的,除非你的业务逻辑不需要和任何外界的模块交互。举个很简单的例子来说。目前很流行的SNS站点,大多都有发消息的功能,无论是心情也好,微博也好就拿微博举例子吧。在发消息这个动作进行的过程需要做什么事情?
消息发送成功之后通知主页timeline立马显示那条消息,在自己的发的消息数字上+1,甚至在一些SAP(single page app上)还需要更新我发送的消息 timeline 等等。
同样微博的收听,评论等等功能也一样。
比较耦合的写法就是在发送请求成功过后,依次在callback里执行相应的逻辑。这就使得,发消息的模块,必须要知道他发送成功了必须要通知哪几个模块,并且执行他们的逻辑。
而在观察者模式情况下是怎么做的呢?抽象的说,在发送消息的请求成功返回后,发送广播消息已发送成功,所有订阅了这个类型的广播的模块依次自己去执行自己的对应逻辑。这样每个模块只需要面向和自己有关的广播,处理相应的逻辑。而不用关心自己和其他具体模块交互的逻辑。
那么到底如何实现这个观察者模式呢?
其实在我们理解里以后,发现观察者需要提供的最基本的接口有下面三个:

  • subscribe 订阅
  • fire 发送广播
  • unsubscribe 取消订阅
var observer = (function(){
     var obList = {};
     function subscribe(msgType,callback){
          //订阅广播
          if(!obList[msgType]){
               obList[msgType] = []
          }
          obList[msgType].push(callback);
     }
     function fire(msgType, data){
          //发送广播
          if(obList[msgType]){
               for(var i=0,l=obList[msgType].length;i<l;i++){
                    //发送广播的数据data
                    obList[msgType][i](data);
               }
          }
     }
     function unsubscribe(msgType, callback){
          //取消订阅
          if(obList[msgType]){
               obList[msgType].shift(obList[msgType].indexOf(callback));
          }         
     }
     return {
         'subscribe' : subscribe,
         'fire' : fire,
         'unsubscribe' : unsubscribe
     };
})()

以上代码是为了阐述观察者模式随手写的单例,不推荐直接使用,我甚至都没有自测,只是把实现的大概思想在这里用代码表述了一遍。当然要注意的是,观察者模式如果管理不善的话,也会导致消息类型的以上的msgType的肆意增长,要优雅的使用观察者模式还需要更好的管理这些msgType,或者可以根据观察的对象不同定义一些不同的频道,这样使得即便观察对象多了也便于维护。
使用观察者模式的好处是你只需要通过这样的设计,就可以避免代码里大量的耦合,做到充分解耦,何乐而不为呢?加上现在DOM LEVEL3 event对象也开始支持以前不支持的但却被很多人实现了的customEvent。通过这个方式也可以实现观察者模式,只不过这个方式依赖DOM和事件对象,或是对于过于抽象的组件也许不适合。其实事件监听器(EventListener)也是观察者模式的一种,现实的例子中观察者模式还是很流行的,所以了解这个模式对前端开发来说很有帮助。
分享到:
评论
2 楼 qbaty 2013-08-12  
sp42 写道
除了观察者模式,究竟还有没有其他模式可选呢?

设计模式里解耦的方式有一些,观察者只是其中之一,实际操作其实是需要考量的。
1 楼 sp42 2013-01-05  
除了观察者模式,究竟还有没有其他模式可选呢?

相关推荐

    JavaScript中的观察者模式:构建响应式编程的基石

    在JavaScript中,观察者模式可以通过多种方式实现,包括自定义事件、发布/订阅模式等。本文将详细介绍如何在JavaScript中实现观察者模式,并探讨其在现代Web开发中的应用。 观察者模式是JavaScript中实现事件驱动...

    JavaScript观察者模式(经典)

    在JavaScript这种事件驱动的语言中,观察者模式有着天然的应用场景,比如DOM事件的处理、Ajax请求的响应等。 观察者模式主要包含以下几种角色: 1. Subject(被观察者):它持有注册的观察者的列表,并负责在状态...

    javascript的oop思想以及单例,工厂,观察者模式简例

    本篇文章将深入探讨JavaScript的OOP思想,并通过实际代码示例介绍单例模式、工厂模式和观察者模式。 首先,面向对象编程的核心概念是类和对象。在JavaScript中,虽然没有传统的类定义,但可以通过构造函数来模拟类...

    JavaScript设计模式+JavaScript模式+JavaScript异步编程

    - 观察者模式:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 - 原型模式:利用原型...

    深入理解JavaScript中的观察者模式:实现与应用

    观察者模式是一种强大的设计模式,它允许对象之间的...在JavaScript中实现观察者模式可以提高代码的可维护性和可扩展性。通过本文的介绍和代码示例,你应该能够理解观察者模式的基本概念,并能够在自己的项目中实现它。

    JavaScript设计模式.pdf

    观察者模式是用于对对象的状态进行观察,并且当它发生变化时能得到通知的方法。它的主要作用是使对象之间的耦合降低,提高系统的灵活性和可扩展性。 10. 命令模式(Command Pattern): 命令模式是对方法调用进行...

    观察者模式.pdf

    在JavaScript中,观察者模式也被称为发布者-订阅者模式,其中包含两个主要角色:发布者(Publisher)和订阅者(Subscriber)。 1. 发布者(Publisher): 发布者是状态发生变化的对象,当它的状态改变时,会通知...

    浅谈javascript中的加减时间.doc

    浅谈javascript中的加减时间.doc

    浅谈JavaScript对象之教学.pdf

    浅谈JavaScript对象之教学 本文旨在探讨JavaScript对象的教学要点,旨在帮助高职软件技术专业的学生更好地理解和掌握JavaScript语言。文章从对象的概念、使用原生对象、原型链的理解、自定义对象的创建和新的语法...

    Cocos2d-x观察者模式其实很简单!!--之游戏开发《赵云要格斗》

    1. **观察者模式的基本概念**:观察者模式是一种行为设计模式,它让多个对象(观察者)订阅一个主题(被观察者),当主题状态改变时,会通知所有订阅者。在C++中,观察者通常是一个类,它实现了特定的回调接口。 2....

    JavaScript应用实例-观察者模式.js

    JavaScript应用实例-观察者模式.js

    Javascript 设计模式 电子书

    观察者模式在JavaScript事件处理中应用非常广泛。 5. 发布/订阅模式:这是观察者模式的变体,在此模式中,发布者和订阅者之间不会直接相互调用,而是通过一个中间层进行通信。在前端开发中,这可以用来解耦模块之间...

    浅谈javascript中this在事件中的应用.doc

    浅谈javascript中this在事件中的应用.doc

    浅谈javascript中的call、apply、bind.doc

    浅谈javascript中的call、apply、bind.doc

    JavaScript设计模式之观察者模式(发布者-订阅者模式)

    在JavaScript中,观察者模式也被称作发布-订阅模式(Publish-Subscribe Pattern),是一种行为设计模式,它允许对象之间通过事件来通信。 观察者模式的核心概念包括观察者(Observer)和目标(Subject)。观察者是...

    《深入浅出JavaScript》PDF版本下载.txt

    - **初学者**:对于没有JavaScript基础的学习者来说,《深入浅出JavaScript》是一个非常好的起点。 - **有一定经验的开发者**:对于已经具备一定JavaScript基础但希望进一步提高自己技术水平的人来说,本书同样适用...

    JavaScript 设计模式 azw3

    最后,还探讨了模块化的JavaScript模式、jQuery及其插件中的设计模式。 《JavaScript设计模式》适合专业的Web开发人员和前端工程师阅读。通过阅读本书,他们将能够提高对设计模式的认识,并学会如何将设计模式应用...

    观察者模式Vs事件委托Demo

    在编程领域,观察者模式(Observer Pattern)和事件委托(Event Delegation)是两种常见的设计模式,它们在处理对象间的交互和通信时起到关键作用。本文将深入探讨这两种模式的概念、工作原理及其在Java中的应用。 ...

    JavaScript设计模式与开发实践.pdf

    第二部分是核心部分,通过一步步完善的代码示例,由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、...

Global site tag (gtag.js) - Google Analytics