观察者模式 又被称为“发布-订阅”模式,目的是解决主题对象和观察者之间功能的耦合性。发布者和订阅者之间是互不干扰的,没有联系的,通过观察者,当做中介,将二者联系起来。

例子:以学生和老师之间的为例

1.首先创建观察者对象

//将观察者放在闭包中,当页面加载就立即执行
var Observer = (function () {
//防止消息队列暴露而被篡改顾将消息容器作为静态私有变量保存
var _message = {};
return {
//注册信息接口
regist: function () {},
//发布信息接口
fire: function () {},
// 移除信息接口
remove:function () {}
}
}) ()

2.创建学生类以及有关方法

//学生类
var Student = function(result) {
var that = this;
that.result = result;
// 学生回答问题动作
that.say = function() {
console.log(that.result);
}
}
//学生回答问题的方法
Student.prototype.answer = function(question) {
// console.log(this.result +''+ question + '回答问题')
//注册参数问题
Observer.regist(question, this.say)
}
// 学生睡觉 ,此时不能回答问题的方法
Student.prototype.sleep = function(question) {
console.log(this.result +''+ question + '已被注销')
//取消对老师问题的监听
Observer.remove(question, this.say)
}

3.创建教师类和有关方法

//教师类
var Teacher = function () {};
//教师提问问题的方法
Teacher.prototype.ask = function (question) {
console.log('问题是:' + question);
//发布提问消息
Observer.fire(question)
}

4.创建实体类

/模拟3位听课的学生
var student1 = new Student('学生1回答问题'),
student2 = new Student('学生2回答问题'),
student3 = new Student('学生3回答问题');

//3位学生监听(订阅)了老师提出的两个问题
student1.answer('什么是设计模式1');
student1.answer('简述观察者模式1');
student2.answer('什么是设计模式2');
student2.answer('简述设计者模式2');
student3.answer('什么是设计模式3');
student3.answer('简述观察者模式3');

//第三位同学 因为睡着了,取消了订阅的第二个问题
student3.sleep('简述观察者模式3');

//创建一个教师类
var teacher = new Teacher();
//老师 提问两个问题
teacher.ask('什么是设计模式');
teacher.ask('简述观察者模式');

js 设计模式之观察者模式的更多相关文章

  1. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

  2. js设计模式——3.观察者模式

    js设计模式——观察者模式 /*js设计模式——.观察者模式*/ // 主题,保存状态,状态变化之后触发所有观察者对象 class Subject { constructor() { this.sta ...

  3. JS设计模式之观察者模式

    观察者模式,即发布与订阅模式,实现一对多的一种关系模式,当一种对象接受信号时其他所有依赖均有行为.我们在写code的时候总是会去自定义一些事件,这就是观察者常常使用的地方: JS中的观察者模式应用: ...

  4. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  5. js 设计模式——观察者模式

    观察者模式 定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状 ...

  6. 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发

    一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...

  7. JS设计模式(一)

    刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...

  8. js设计模式(12)---职责链模式

    0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...

  9. JS设计模式——5.单体模式

    JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html   单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...

随机推荐

  1. 16、使用limit offset 分页时,为什么越往后翻越慢?如何解决?

    在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦. 当一个表数据有几百万的数据的时候成了问题! 如 * f ...

  2. 在badboy中添加检查点并且参数化

    在badboy中添加检查点(使用百度搜索来举例): 1.打开badboy,在输入框中输入www.baidu.com,单击键盘回车键或者点击输入框右边的按钮进入百度页面: 2.在百度搜索框中输入搜索字, ...

  3. k64 datasheet学习笔记22---Direct Memory Access Controller (eDMA)

    0.前言 本文主要介绍DMA相关内容 1.简介 DMA模块包含: 1.一个DMA引擎 源和目的地址的计算 数据搬移 2.本地存储的传输控制描述TCD,对于16个传输通道中的每一个各对应一个TCD 1. ...

  4. Codeforces 877E - Danil and a Part-time Job 线段树+dfs序

    给一个有根树,1e5个节点,每个节点有权值0/.1,1e5操作:1.将一个点的子树上所有点权值取反2.查询一个点的子树的权值和   题解: 先深搜整颗树,用dfs序建立每个点对应的区间,等于把树拍扁成 ...

  5. 手把手教你写vue插件并发布(一)

    vue的插件开发 这篇文章较长,需要一定的阅读时间.这里有一份改善版本的插件笔记,在一个项目下完成开发.测试.发布的全过程.https://www.cnblogs.com/adouwt/p/96555 ...

  6. 小程序 第一个学习示例(TodoList)

    1. 概述 1.1 说明 在微信开发者工具环境下开发一个简易的TodoList功能,以便能够进行学习与熟练小程序相关功能与信息.. 示例中,初步计划包含以下功能: 1.能够进行新增计划信息 2.计划信 ...

  7. Jquery点击div之外的地方隐藏当前div

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...

  8. TCP 的那些事儿

    TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是推荐你去 ...

  9. vue-标签页组件

    content <template> <div class="tab-content"> <TabBar v-model="activeKe ...

  10. java中对象的创建过程

    public class Test1 { public static void main(String[] args) { new B(); System.out.println("---- ...