定义:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

对象:    抽象主题角色:每个抽象主题角色都可以有任意数量的观察者。抽象主题提供可以增加和删除观察者角色的方法。

    具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。

    抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

    具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。

代码示例:

使用JDK自带的观察者模式,来写个房东通知租客要收房租的案例。

这里的抽象主题角色和抽象观察者角色都是用的JDK的Observable和Observer两个类。

具体观察者角色:

A租客

package com.observer;import java.util.Observable;
import java.util.Observer;public class TenantA implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("收房租了");}}

View Code

B租客

package com.observer;import java.util.Observable;
import java.util.Observer;public class TenantB implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("收房租了");}}

View Code

C租客

package com.observer;import java.util.Observable;
import java.util.Observer;public class TenantC implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("收房租了");}}

View Code

具体主题角色:

房东

package com.observable;import java.util.Observable;public class Landlord extends Observable{public void receiveRent(){setChanged();notifyObservers();}}

View Code

测试观察者模式:

package com.observable;import com.observer.TenantA;
import com.observer.TenantB;
import com.observer.TenantC;public class TestObserver {public static void main(String[] args) {Landlord landlord = new Landlord();TenantA tenantA = new TenantA();TenantB tenantB = new TenantB();TenantC tenantC = new TenantC();landlord.addObserver(tenantA);landlord.addObserver(tenantB);landlord.addObserver(tenantC);landlord.receiveRent();}}

View Code

总结:此为简单的观察者模式案例,如果想带通知参数可以notifyObservers()方法里面传参,并且也可以传具体的主题角色过去。此setChanged()方法是告诉Observable,主题要变化了,

要通知观察者了,如果此方法没写,则永远也通知不到观察者。

源码:

package java.util;// 抽象主题角色
public class Observable {// 用于判断是否通知观察者private boolean changed = false;// 观察者集合private Vector<Observer> obs;public Observable() {obs = new Vector<>();}// 添加观察者public synchronized void addObserver(Observer o) {if (o == null)throw new NullPointerException();if (!obs.contains(o)) {obs.addElement(o);}}// 删除观察者public synchronized void deleteObserver(Observer o) {obs.removeElement(o);}// 通知方法,无参会调用有参的public void notifyObservers() {notifyObservers(null);}// 通知方法,先通过变量changed判断是否通知,为true则循环观察者进行通知public void notifyObservers(Object arg) {Object[] arrLocal;synchronized (this) {if (!changed)return;arrLocal = obs.toArray();clearChanged();}for (int i = arrLocal.length-1; i>=0; i--)((Observer)arrLocal[i]).update(this, arg);}// 删除所有观察者public synchronized void deleteObservers() {obs.removeAllElements();}// 通知观察者protected synchronized void setChanged() {changed = true;}// 清除通知protected synchronized void clearChanged() {changed = false;}// 获取是否通知public synchronized boolean hasChanged() {return changed;}// 观察者个数public synchronized int countObservers() {return obs.size();}
}

View Code

转载于:https://www.cnblogs.com/mengxuanyou/p/6920435.html

设计模式 - 观察者模式(JDK)相关推荐

  1. 设计模式 | 观察者模式及典型应用

    本文主要内容: 介绍观察者模式 微信公众号的发布/订阅示例 观察者模式总结 分析观察者模式的典型应用 JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托 ...

  2. 设计模式●观察者模式

    设计模式●观察者模式 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅( ...

  3. 设计模式-观察者模式(Observer)-Java

    设计模式-观察者模式(Observer)-Java 目录 文章目录 1.前言 2.示例案例-多人联机对战游戏的设计 3.观察者模式概述 3.1.观察者模式定义 3.2.观察者模式结构 3.3.观察者模 ...

  4. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  5. [Head First设计模式]山西面馆中的设计模式——观察者模式

    原文:[Head First设计模式]山西面馆中的设计模式--观察者模式 系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也 ...

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

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

  7. 【学习笔记】ABAP OOD设计模式 - 观察者模式

    ABAP OOD设计模式 - 观察者模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,这个对象相关依赖的 ...

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

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

  9. 设计模式---观察者模式介绍与理解

    设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,observer: ...

  10. 设计模式-观察者模式 发布/订阅模式

    设计模式-观察者模式 发布/订阅模式 代码 观察者接口 public interface IHanFeiZi{// 当吃早饭时public void havBreakFast();// 进行娱乐活动时 ...

最新文章

  1. 关于ios中编译ffmpeg0.9.2库
  2. c语言c2182是什么错误,C语言中一种更优雅的异常处理机制
  3. 数据库系统概论:第五章 数据库完整性
  4. 访问者模式用到了一种双分派的技术——静态分派和动态分派
  5. nginx源码初读(8)--让烦恼从数据结构开始(ngx_event)
  6. 【转】 i2c驱动调试经验
  7. GOOGLE 分布式系统关键技术论文分析
  8. cad2008加载 et拓展工具_译文:8个值得推荐的用于前端开发的性能分析工具「渡一教育」...
  9. 数据中心热度高 苹果也来掺一脚
  10. python是什么 自学-怎么自学python,大概要多久?
  11. JAVA日志框架概述
  12. acegis连接使用方法_arcgis工具使用方法
  13. 毕业找工作 送给大家一些漂亮的个人简历模板
  14. 程序设计课程设计——学生学籍管理系统
  15. BZOJ2434: [Noi2011]阿狸的打字机
  16. A按键控制LED状态
  17. Java读取文件夹下的文件并进行处理
  18. python pip 安装失败问题解决
  19. altera fpga 型号说明_ALTERA的FPGA命名规则
  20. Praat脚本-005 | 标注文件批量增加层级

热门文章

  1. MySQL alter
  2. Nginx配置文件粗解
  3. 崔强:如果有知识就做一个内裤外穿飞行的超人
  4. VSTO进行时––开发日志之二(VSTO Development diary II)
  5. php 数字转中文函数 1转一,一个阿拉伯数字转中文数字的函数-PHP教程,PHP函数
  6. 3.6.1 局域网的基本概念和体系结构
  7. 基于 FPGA 的并行全比较排序算法,topK
  8. FPGA在电平接口领域的应用
  9. ADC的有效位数与有效分辨率的区别
  10. Linux下如何测试及使用USB转串口线