设计模式 - 观察者模式(JDK)
定义:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
对象: 抽象主题角色:每个抽象主题角色都可以有任意数量的观察者。抽象主题提供可以增加和删除观察者角色的方法。
具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。
代码示例:
使用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)相关推荐
- 设计模式 | 观察者模式及典型应用
本文主要内容: 介绍观察者模式 微信公众号的发布/订阅示例 观察者模式总结 分析观察者模式的典型应用 JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托 ...
- 设计模式●观察者模式
设计模式●观察者模式 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅( ...
- 设计模式-观察者模式(Observer)-Java
设计模式-观察者模式(Observer)-Java 目录 文章目录 1.前言 2.示例案例-多人联机对战游戏的设计 3.观察者模式概述 3.1.观察者模式定义 3.2.观察者模式结构 3.3.观察者模 ...
- Python设计模式-观察者模式
Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...
- [Head First设计模式]山西面馆中的设计模式——观察者模式
原文:[Head First设计模式]山西面馆中的设计模式--观察者模式 系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 【学习笔记】ABAP OOD设计模式 - 观察者模式
ABAP OOD设计模式 - 观察者模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,这个对象相关依赖的 ...
- Java设计模式-观察者模式(订阅发布模式)
Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...
- 设计模式---观察者模式介绍与理解
设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,observer: ...
- 设计模式-观察者模式 发布/订阅模式
设计模式-观察者模式 发布/订阅模式 代码 观察者接口 public interface IHanFeiZi{// 当吃早饭时public void havBreakFast();// 进行娱乐活动时 ...
最新文章
- 关于ios中编译ffmpeg0.9.2库
- c语言c2182是什么错误,C语言中一种更优雅的异常处理机制
- 数据库系统概论:第五章 数据库完整性
- 访问者模式用到了一种双分派的技术——静态分派和动态分派
- nginx源码初读(8)--让烦恼从数据结构开始(ngx_event)
- 【转】 i2c驱动调试经验
- GOOGLE 分布式系统关键技术论文分析
- cad2008加载 et拓展工具_译文:8个值得推荐的用于前端开发的性能分析工具「渡一教育」...
- 数据中心热度高 苹果也来掺一脚
- python是什么 自学-怎么自学python,大概要多久?
- JAVA日志框架概述
- acegis连接使用方法_arcgis工具使用方法
- 毕业找工作 送给大家一些漂亮的个人简历模板
- 程序设计课程设计——学生学籍管理系统
- BZOJ2434: [Noi2011]阿狸的打字机
- A按键控制LED状态
- Java读取文件夹下的文件并进行处理
- python pip 安装失败问题解决
- altera fpga 型号说明_ALTERA的FPGA命名规则
- Praat脚本-005 | 标注文件批量增加层级