• JavaScript 设计模式之观察者模式


    观察者模式

    观察者模式又被称为发布-订阅模式,使用一个对象来收集订阅者,在发布时遍历所有订阅者,然后将信息传递给订阅者,可以这样来实现一个简单的模式

    1. const Observable = (function () {
    2. let __messages = {}
    3. return {
    4. register: function (type, fn) {
    5. if (typeof __messages[type] === 'undefined') {
    6. __messages[type] = [fn]
    7. } else {
    8. __messages[type].push(fn)
    9. }
    10. },
    11. fire: function (type, args = {}) {
    12. if (__messages[type] === undefined) {
    13. return
    14. }
    15. let events = {
    16. type,
    17. args
    18. }
    19. __messages[type].forEach(fn => {
    20. fn.call(this, events)
    21. })
    22. },
    23. remove: function (type, fn) {
    24. if (__messages[type] instanceof Array) {
    25. let index = __messages[type].indexOf(fn)
    26. if (index >= 0) {
    27. __messages[type].splice(index, 1)
    28. }
    29. }
    30. }
    31. }
    32. })()
    33. const fn = function (e) {
    34. console.log(e.type,e.args.msg)
    35. }
    36. Observable.register('test', fn)
    37. Observable.remove('test',fn)
    38. Observable.register('test', function (e) {
    39. console.log(e.type,e.args.msg,2122)
    40. })
    41. Observable.fire('test', { msg: 'hello world' }) // test hello world 2122

    案例

    假使有一个学生跟老师的互动

    1. // 学生类
    2. const Student = function (result) {
    3. this.result = result
    4. this.say = ()=> {
    5. console.log(this.result)
    6. }
    7. }
    8. // 学生回答问题
    9. Student.prototype.answer = function (que) {
    10. // 注册事件
    11. Observable.register(que, this.say)
    12. }
    13. Student.prototype.sleep = function (que) {
    14. console.log(this.result + ' ' + que + '被注销')
    15. Observable.remove(que, this.say)
    16. }
    17. // 老师类
    18. const Teacher = function () {
    19. }
    20. Teacher.prototype.ask = function (que) {
    21. console.log('老师提问:' + que)
    22. Observable.fire(que)
    23. }
    24. let stu1 = new Student('学生1回答问题')
    25. let stu2 = new Student('学生2回答问题')
    26. let tea = new Teacher()
    27. stu1.answer('1+1等于多少')
    28. stu1.answer('2+2等于多少')
    29. stu2.answer('1+1等于多少')
    30. stu2.answer('2+2等于多少')
    31. stu2.sleep('1+1等于多少')
    32. tea.ask('1+1等于多少')
    33. tea.ask('2+2等于多少')

    输出

    1. /*
    2. 学生2回答问题 1+1等于多少被注销
    3. 老师提问:1+1等于多少
    4. 学生1回答问题
    5. 老师提问:2+2等于多少
    6. 学生1回答问题
    7. 学生2回答问题
    8. */

    结论

    通过观察者模式可以团队开发中模块间通讯问题

    解耦两个相互依赖的对象,使其侧重依赖于观察者的消息机制。这样对于任意一个订阅者对象来说,其他订阅者对象的改变不会影响到自身。对于每一个订阅者来说,其自与既可以是消息的发出者也可以是消息的执行者,这都依赖于调用观察者对象的三种方法(订消息,注销消息,发布消息)中的哪一种

  • 相关阅读:
    GPIO 模拟SPI
    【ACWing】2714. 左偏树
    intellij plugin(插件)的项目解析及研读
    vue父子组件传值与兄弟传值的注意点
    基于Android课堂作业师生交流教学选课助手java mysql
    如何完美地处理JavaScript渲染页面中的异步加载?
    使用 C++23 协程实现第一个 co_await 同步风格调用接口--Qt计算文件哈希值
    HTML常用标签
    如何定位慢查询SQL以及优化
    2024抖音矩阵云混剪系统源码 短视频矩阵营销系统
  • 原文地址:https://blog.csdn.net/u010279990/article/details/136225234