设计模式学习之观察者模式

向右看齐 2024-03-17 12:23 109阅读 0赞

设计模式系列往期文章

  1. 设计模式学习之策略模式
  2. 设计模式学习之策略模式在前端的应用
  3. 设计模式学习之简单工厂模式
  4. 设计模式学习之工厂方法模式
  5. 设计模式学习之抽象工厂模式
  6. 设计模式学习之策略模式和简单工厂模式的对比

这是设计模式系列的第7篇文章,在这之前我们已经介绍过了设计模式中最常使用的工厂模式和策略模式,本文将详细介绍一下观察者模式。观察者模式是行为模式中的一种,许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
在这里插入图片描述
举个例子,如果你希望持续接收某个微信公众号发送的消息,你可以点击订阅,那么每次公众号有新的文章发布了就会推送给你,你就是订阅者,对应的微信公众号就是发布者。下图是观察者模式的结构,在发布者Publisher类中定义了一个订阅者数组用来维护所有订阅者信息,其中还有添加订阅者、删除订阅者、通知订阅者等方法;而在订阅者Subscriber类中有更新数据的方法,可以供发布者调用:
在这里插入图片描述
下面给出观察者模式的伪代码:

  1. // 发布者基类包含订阅管理代码和通知方法。
  2. class EventManager is
  3. private field listeners: hash map of event types and listeners
  4. method subscribe(eventType, listener) is
  5. listeners.add(eventType, listener)
  6. method unsubscribe(eventType, listener) is
  7. listeners.remove(eventType, listener)
  8. method notify(eventType, data) is
  9. foreach (listener in listeners.of(eventType)) do
  10. listener.update(data)
  11. // 具体发布者包含一些订阅者感兴趣的实际业务逻辑。我们可以从发布者基类中扩
  12. // 展出该类,但在实际情况下并不总能做到,因为具体发布者可能已经是子类了。
  13. // 在这种情况下,你可用组合来修补订阅逻辑,就像我们在这里做的一样。
  14. class Editor is
  15. public field events: EventManager
  16. private field file: File
  17. constructor Editor() is
  18. events = new EventManager()
  19. // 业务逻辑的方法可将变化通知给订阅者。
  20. method openFile(path) is
  21. this.file = new File(path)
  22. events.notify("open", file.name)
  23. method saveFile() is
  24. file.write()
  25. events.notify("save", file.name)
  26. // ……
  27. // 这里是订阅者接口。如果你的编程语言支持函数类型,则可用一组函数来代替整
  28. // 个订阅者的层次结构。
  29. interface EventListener is
  30. method update(filename)
  31. // 具体订阅者会对其注册的发布者所发出的更新消息做出响应。
  32. class LoggingListener implements EventListener is
  33. private field log: File
  34. private field message: string
  35. constructor LoggingListener(log_filename, message) is
  36. this.log = new File(log_filename)
  37. this.message = message
  38. method update(filename) is
  39. log.write(replace('%s',filename,message))
  40. class EmailAlertsListener implements EventListener is
  41. private field email: string
  42. private field message: string
  43. constructor EmailAlertsListener(email, message) is
  44. this.email = email
  45. this.message = message
  46. method update(filename) is
  47. system.email(email, replace('%s',filename,message))
  48. // 应用程序可在运行时配置发布者和订阅者。
  49. class Application is
  50. method config() is
  51. editor = new Editor()
  52. logger = new LoggingListener(
  53. "/path/to/log.txt",
  54. "有人打开了文件:%s");
  55. editor.events.subscribe("open", logger)
  56. emailAlerts = new EmailAlertsListener(
  57. "admin@example.com",
  58. "有人更改了文件:%s")
  59. editor.events.subscribe("save", emailAlerts)

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式学习--观察模式

      观察者模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 ![Sout

    相关 设计模式观察模式

    前言 使用场景: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟

    相关 设计模式观察模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 即目标发生更

    相关 设计模式观察模式

    定义 当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步

    相关 设计模式观察模式

     今天放假,又有时间继续啃《java设计模式》这本书了。每次学会一种设计模式内心都会有一种小小的成就感,但是懂是懂了,不知道会不会用。主要是现在没有什么项目经验,设计模式学了也

    相关 设计模式观察模式

    [上一篇:设计模式之策略模式][Link 1] 故事要从气象站说起,气象站有个WeatherData对象,这个对象负责拿到所有的气象数据(温度、湿度、气压),而气象站同时也

    相关 设计模式观察模式

    1 观察者模式 当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都

    相关 设计模式——观察模式

    > 设计模式: > > 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案