JDK中的设计模式之观察者模式

拼搏现实的明天。 2022-06-04 06:41 333阅读 0赞

The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.

JDK中的

java.util.Observer
java.util.Observable

实现了观察者模式

其中接口Observer定义了订阅者update消息接收接口

void update(Observable o, Object arg);

Observable类定义了订阅者订阅、取消和通知接口

  1. public synchronized void addObserver(Observer o) {
  2. if (o == null)
  3. throw new NullPointerException();
  4. if (!obs.contains(o)) {
  5. obs.addElement(o);
  6. }
  7. }
  8. /**
  9. * Deletes an observer from the set of observers of this object.
  10. * Passing <CODE>null</CODE> to this method will have no effect.
  11. * @param o the observer to be deleted.
  12. */
  13. public synchronized void deleteObserver(Observer o) {
  14. obs.removeElement(o);
  15. }
  16. /**
  17. * If this object has changed, as indicated by the
  18. * <code>hasChanged</code> method, then notify all of its observers
  19. * and then call the <code>clearChanged</code> method to indicate
  20. * that this object has no longer changed.
  21. * <p>
  22. * Each observer has its <code>update</code> method called with two
  23. * arguments: this observable object and the <code>arg</code> argument.
  24. *
  25. * @param arg any object.
  26. * @see java.util.Observable#clearChanged()
  27. * @see java.util.Observable#hasChanged()
  28. * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
  29. */
  30. public void notifyObservers(Object arg) {
  31. /*
  32. * a temporary array buffer, used as a snapshot of the state of
  33. * current Observers.
  34. */
  35. Object[] arrLocal;
  36. synchronized (this) {
  37. /* We don't want the Observer doing callbacks into
  38. * arbitrary code while holding its own Monitor.
  39. * The code where we extract each Observable from
  40. * the Vector and store the state of the Observer
  41. * needs synchronization, but notifying observers
  42. * does not (should not). The worst result of any
  43. * potential race-condition here is that:
  44. * 1) a newly-added Observer will miss a
  45. * notification in progress
  46. * 2) a recently unregistered Observer will be
  47. * wrongly notified when it doesn't care
  48. */
  49. if (!changed)
  50. return;
  51. arrLocal = obs.toArray();
  52. clearChanged();
  53. }
  54. for (int i = arrLocal.length-1; i>=0; i--)
  55. ((Observer)arrLocal[i]).update(this, arg);
  56. }

下面是一个JDK 观察者模式的一个简单应用,代码示例如下:

消费发布者

重载订阅、取消、通知接口,直接调用父类Observable相关接口

  1. import java.util.Observable;
  2. import java.util.Observer;
  3. public class Publisher extends Observable {
  4. @Override
  5. public synchronized void addObserver(Observer o) {
  6. super.addObserver(o);
  7. }
  8. @Override
  9. public synchronized void deleteObserver(Observer o) {
  10. super.deleteObserver(o);
  11. }
  12. @Override
  13. public void notifyObservers(Object arg) {
  14. super.setChanged();
  15. super.notifyObservers(arg);
  16. }
  17. private String name;
  18. public Publisher(String name) {
  19. this.name = name;
  20. }
  21. @Override
  22. public String toString() {
  23. return name;
  24. }
  25. }

消息订阅者

重载消息接收update方法

  1. import java.util.Observable;
  2. import java.util.Observer;
  3. public class Subscriber implements Observer {
  4. private String name;
  5. public Subscriber(String name) {
  6. this.name = name;
  7. }
  8. @Override
  9. public void update(Observable o, Object arg) {
  10. System.out.println(String.format("%s received message %s from %s", name, arg, o.toString()));
  11. }
  12. }

测试调用

  1. public class Main {
  2. public static void main(String[] args) {
  3. Subscriber s0 = new Subscriber("s0");
  4. Subscriber s1 = new Subscriber("s1");
  5. Publisher observer = new Publisher("北京气象台");
  6. observer.addObserver(s0);
  7. observer.addObserver(s1);
  8. observer.notifyObservers("明日大雨");
  9. }
  10. }

执行结果

s1 received message 明日大雨 from 北京气象台
s0 received message 明日大雨 from 北京气象台

发表评论

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

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

相关阅读

    相关 设计模式观察模式

    观察者模式 什么是观察者模式 观察者模式属于行为模式的一种,定义了对象的通用交流方式。 观察者模式定义了一对多的关系,一个对象改变了状态,则其它所有依赖

    相关 设计模式观察模式

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

    相关 设计模式观察模式

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

    相关 设计模式观察模式

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

    相关 设计模式观察模式

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

    相关 设计模式观察模式

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

    相关 设计模式观察模式

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

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

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