一、概述

  当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。

  定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。

  Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

1.1、适用场景

  一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

  关联行为场景,建立一套触发机制

典型应用

    1、侦听事件驱动程序设计中的外部事件

    2、侦听/监视某个对象的状态变化

    3、发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者

1.2、优缺点

优点:

  • 观察者和被观察者之间建立一个抽象的耦合
  • 观察者模式支持广播通信,建立一套触发机制。

缺点:

  • 观察者之间有过多的细节依赖、提高时间消耗及程序复杂度
  • 使用要得当,要避免循环调用

1.3、类图角色及其职责

  004-行为型-03-观察者模式(Observer)

  1、Subject(被观察者)
      被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。

  2、ConcreteSubject
      被观察者的具体实现。包含一些基本的属性状态及其他操作。

  3、Observer(观察者)
      接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。

  4、ConcreteObserver
      观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

1.4、演进过程

使用:被观察者想要起作用,就必须继承java.util包下的Observable类

构造方法摘要
Observable() 
          构造一个带有零个观察者的 Observable。

 

方法摘要
 void addObserver(Observer o) 
          如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。
protected  void clearChanged() 
          指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false
 int countObservers() 
          返回 Observable 对象的观察者数目。
 void deleteObserver(Observer o) 
          从对象的观察者集合中删除某个观察者。
 void deleteObservers() 
          清除观察者列表,使此对象不再有任何观察者。
 boolean hasChanged() 
          测试对象是否改变。
 void notifyObservers() 
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
 void notifyObservers(Object arg) 
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
protected  void setChanged() 
          标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true

  示例: 监听成员变量变化

public class PersonOrg {
    private String name;
    private String sex;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
View Code

相关文章:

  • 2021-06-25
  • 2021-06-03
  • 2021-09-01
  • 2022-12-23
  • 2021-12-08
  • 2021-11-14
  • 2021-08-31
  • 2021-06-22
猜你喜欢
  • 2021-08-24
  • 2021-04-13
  • 2022-02-02
  • 2021-11-22
  • 2021-07-26
  • 2021-09-01
  • 2021-11-11
相关资源
相似解决方案