用途


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

结构


图-观察者模式结构图

Subject : 主题类,保存所有订阅此主题的观察者,观察者的数量是任意的。定义添加观察者 (Attach)删除观察者 (Detach) 的接口。
abstract class Subject {
    protected String name;
    protected String state;
    protected List<Observer> observers = new ArrayList<Observer>();
    
    public abstract String getState();    
    public abstract void setState(String state);
    public abstract void Notify();

public Subject(String name) {
        this.name = name;
    }
    
    public void Attach(Observer observer) {
        observers.add(observer);
    }
    
    public void Detach(Observer observer) {
        observers.remove(observer);
    }
}

Observer : 观察者类,定义更新接口 (Update),当收到 Subject 的通知时,Observer 需要同步更新信息。

abstract class Observer {
    protected String name;
    protected Subject subject;
    public Observer(String name, Subject subject) {
        this.name = name;
        this.subject = subject;
    }
    public abstract void Update();
}

ConcreteSubject : 具体主题类,存储对于这个主题感兴趣的所有观察者。当内部状态发生变化时,应通知所有登记的观察者 (Notify)

class ConcreteSubject extends Subject {
    public ConcreteSubject(String name) {
        super(name);
    }

@Override
    public String getState() {
        return state;
    }

@Override
    public void setState(String state) {
        this.state = state;
    }
    
    @Override
    public void Notify() {
        System.out.println("======= " + this.name + "主题发布新消息 =======");
        for (Observer observer : observers) {
            observer.Update();
        }
    }
}

ConcreteObserver : 具体观察者类,实现 Observer 的更新接口 (Update),以便和 Subject 同步状态信息。

class ConcreteObserver extends Observer {
    private String state;
    public ConcreteObserver(String name, Subject subject) {
        super(name, subject);
    }

@Override
    public void Update() {
        state = subject.getState();
        System.out.println(this.name + "收到当前状态:" + state);
    }
}

测试代码

public class ObserverPattern {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject("天气");    
        ConcreteObserver observer1 = new ConcreteObserver("张三", subject);
        ConcreteObserver observer2 = new ConcreteObserver("李四", subject);
        ConcreteObserver observer3 = new ConcreteObserver("王五", subject);
        
        subject.Attach(observer1);
        subject.Attach(observer2);
        subject.Attach(observer3);    
        subject.setState("今天下雨");
        subject.Notify();
        
        subject.Detach(observer2);
        subject.setState("明天天晴");
        subject.Notify();
    }
}

View Code

运行结果

======= 天气主题发布新消息 =======
张三收到当前状态:今天下雨
李四收到当前状态:今天下雨
王五收到当前状态:今天下雨
======= 天气主题发布新消息 =======
张三收到当前状态:明天天晴
王五收到当前状态:明天天晴

View Code

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》

《HeadFirst设计模式》

JAVA 设计模式 观察者模式相关推荐

  1. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  2. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  3. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. Java设计模式——观察者模式

    转自:http://www.cnblogs.com/shamgod/p/4588557.html 一.概述 childe类中的是关联监听者dad的,若要再增加监听者,会很不方便,且要修改代码.好的方法 ...

  6. java设计模式-观察者模式

    观察者模式介绍: 观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提 ...

  7. Java设计模式——观察者模式与Spring事件监听器

    写在前面的话:终于通读了一遍<Spring源码深度解析>,在Spring的消息发布(Message)模块使用了设计模式中的观察者模式的经典实现,所以趁此机会总结一些. 1. 业务场景 Sp ...

  8. java设计模式---观察者模式

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

  9. JAVA设计模式-观察者模式(Observe)

    观察者模式 其实就是一个发布者和订阅者之间的关系 如果订阅者订阅了发布者,那么发布者发布一条消息,订阅者就会立马知道. 中间的关系也就是订阅者需要去订阅消息(也就是,发布者的通知资源池子(也就是存储订 ...

最新文章

  1. PyTorch深度学习训练可视化工具tensorboardX
  2. 程序员节,10月24日!
  3. hibernate持久化对象
  4. elementui分页组件按钮样式修改_Vue使用Elementui修改默认最快方法!
  5. C++之父谈C++:一天之内你就能学会出色使用C++
  6. 实验1-4 输出三角形 (5 分)
  7. 【完美解决】ds1302外置时钟模块重复初始化时间问题(单片机掉电,模块电池供电)
  8. JDK安装与环境变量配置(WIN7)
  9. 无线路由器CPU浅析 MT7621A、 BCM47189 到底谁强?
  10. 计算机二进制发明者,谁是二进制的发明者
  11. 【现代密码学】作业一
  12. QChartView
  13. 图像曲率 与 黎曼几何
  14. Downloading https://ultralytics.com/assets/Arial.ttf to /data/..../.config/Ultralytics/Arial.ttf
  15. Import theano gives the AttributeError: module 'theano' has no attribute 'gof'
  16. VirtualBox中win7系统无法安装增强功能
  17. Matplotlib--palette调色板
  18. voxelmorph中的STN网络
  19. Python爬虫爬取百度贴吧的帖子
  20. MATLAB中的vpa()函数的使用(附例子和代码)

热门文章

  1. RabbitMQ—为什么使用信道channel
  2. 在Android应用外获取app的签名
  3. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别
  4. JMS ActiveMQ案例
  5. [转]ASP.NET会话(Session)保存模式
  6. UOJ #585. 新年和多米诺
  7. Java基础教程——Set
  8. 面试准备——Struts2相关问题
  9. MIT 6.031 Software Construction Lab1-Part2-Personal-Art
  10. Day38:进程与线程