设计模式之观察者模式(Observable与Observer)

简介: 好久没有写博客啦,之前看完了《设计模式之禅》也没有总结一下,现在回忆一下设计模式之观察者模式。 1.什么是观察者模式   简单情形:有A、B、C、D等四个独立的对象,其中B、C、D这三个对象想在A对象发生改变的第一时间知道这种改变,以便做出相应的响应或者对策。

好久没有写博客啦,之前看完了《设计模式之禅》也没有总结一下,现在回忆一下设计模式之观察者模式。

1.什么是观察者模式

  简单情形:有A、B、C、D等四个独立的对象,其中B、C、D这三个对象想在A对象发生改变的第一时间知道这种改变,以便做出相应的响应或者对策。

  上面的这种情形,就是观察者模式。

  当然可以有多个观察者多个被观察者

  观察者与被观察者也不是对立的,一个对象可以观察其他对象,也可以被其他对象观察。

2.观察者模式的应用

  为了更好的理解什么是观察者模式,下面我举一些可能用到该模式的情形或例子:

  (1)周期性任务。比如linux中的周期性任务命令crontab命令,win7下的定时关机命令shutdown -s -t 1200(1200s后关机)。这些命令当预期系统时间到后,就可以通知相应的观察者激活相应的命令。

  (2)重新加载配置文件。现在做大型系统基本都会有配置文件,例如在SSH项目中每次修改配置文件后,都需要重新启动服务器才能使得新的配置文件生效(当然SSH中貌似已经提供了参数设置,当配置文件修改时,可以自动重新加载)。

3.观察者模式需要用到的Java类

  3.1 java.util.Observable

    -able一般可能...的单词后缀,Observable就是可以被观察的,程序中的被观察者类,需要继承这个类。

  3.2 java.util.Observer

    这个是观察者,是接口。程序中的观察者类,需要实现这个接口中的update()方法。

4.程序实例+注释说明

  4.1 身份单一的观察者(被观察者)

  4.1.1被观察者类

import java.util.Observable;
 //被观察者类
public class NumObservable extends Observable {
    int data = 0;
 
    public void setData(int i) {
       data = i;
       setChanged();    //标记此 Observable对象为已改变的对象
       notifyObservers();    //通知所有观察者
    }
}

  4.1.2观察者类

import java.util.Observable;
import java.util.Observer;
 //观察者类
public class NumObserver implements Observer{
    
    public void update(Observable o, Object arg) {    //有被观察者发生变化,自动调用对应观察者的update方法
       NumObservable myObserable=(NumObservable) o;     //获取被观察者对象
       System.out.println("Data has changed to " +myObserable.data);
    }
}

  4.1.3 Test测试类

public class Test {
    public static void main(String[] args) {
       NumObservable number = new NumObservable();    //被观察者对象
       number.addObserver(new NumObserver());    //给number这个被观察者添加观察者(当然可以有多个观察者)
       number.setData(1);
       number.setData(2);
       number.setData(3);
    }
}

  测试输出:

  

  4.2 既是观察者又是被观察者

   4.2.1 MultA类

import java.util.Observable;
import java.util.Observer;

public class MultA extends Observable implements Observer{
    public void update(Observable o, Object arg) {    //有被观察者发生变化,自动调用相应观察者的update方法
       MultB multb=(MultB) o;     //获取被观察者对象
       System.out.println("MultA监听到MultB数据变化:" +multb.data);
       
       setChanged();    
       notifyObservers();    //自己观察到数据变化,通知自己的观察者
    }
}

  4.2.2 MultB类

import java.util.Observable;
import java.util.Observer;    
public class MultB extends Observable implements Observer {
    int data = 0;
 
    public void setData(int i) {
       data = i;
       setChanged();    //标记此 Observable对象为已改变的对象
       notifyObservers();    //通知所有观察者
    }

    public void update(Observable arg0, Object arg1) {
        System.out.println("MultB观察到几乎同时MultA也有数据变化,貌似自己的变化被监听。。。。");
    }
}

  4.2.3 Test测试类

public class Test {
    public static void main(String[] args) {
       MultA multa = new MultA();    
       MultB multb = new MultB();
       
       multb.addObserver(multa);
       multa.addObserver(multb);
       
       multb.setData(1);
    }
}

  输出结果:

    

相关文章
|
11月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
9月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
656 8
|
设计模式 存储 供应链
前端必须掌握的设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,实现了一种订阅机制。它包含两个角色:**观察者**(订阅消息、接收通知并执行操作)和**被观察者**(维护观察者列表、发送通知)。两者通过一对多的关系实现解耦,当被观察者状态改变时,会通知所有订阅的观察者。例如,商店老板作为被观察者,记录客户的需求并在商品到货时通知他们。前端应用中,如DOM事件注册、MutationObserver等也体现了这一模式。
|
设计模式 消息中间件 存储
【设计模式】【行为型模式】观察者模式(Observer)
一、入门 什么是观察者模式? 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
542 9
|
设计模式 消息中间件 存储
设计模式:观察者模式
观察者模式属于行为型设计模式,用于建立对象间的一对多依赖关系。当主题(Subject)状态变化时,所有依赖的观察者(Observer)会自动收到通知并更新。
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
367 6
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
164 1
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
394 16
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
397 0
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
565 0