观察者模式及Java实现例子
观察者模式
观察者模式 Observer
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
观察者模式的组成
抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
程序实例
通过程序实例来说明观察者模式:
首先定义抽象的观察者:
//抽象观察者角色 public interface Watcher {public void update(String str);}
然后定义抽象的主题角色,即抽象的被观察者,在其中声明方法(添加、移除观察者,通知观察者):
//抽象主题角色,watched:被观察 public interface Watched {public void addWatcher(Watcher watcher);public void removeWatcher(Watcher watcher);public void notifyWatchers(String str);}
然后定义具体的观察者:
public class ConcreteWatcher implements Watcher {@Overridepublic void update(String str){System.out.println(str);}}
之后是具体的主题角色:
import java.util.ArrayList; import java.util.List;public class ConcreteWatched implements Watched {// 存放观察者private List<Watcher> list = new ArrayList<Watcher>();@Overridepublic void addWatcher(Watcher watcher){list.add(watcher);}@Overridepublic void removeWatcher(Watcher watcher){list.remove(watcher);}@Overridepublic void notifyWatchers(String str){// 自动调用实际上是主题进行调用的for (Watcher watcher : list){watcher.update(str);}}}
编写测试类:
public class Test {public static void main(String[] args){Watched girl = new ConcreteWatched();Watcher watcher1 = new ConcreteWatcher();Watcher watcher2 = new ConcreteWatcher();Watcher watcher3 = new ConcreteWatcher();girl.addWatcher(watcher1);girl.addWatcher(watcher2);girl.addWatcher(watcher3);girl.notifyWatchers("开心");}}
参考资料
张龙老师Java SE系列视频教程。
本博客中关于观察者模式的相关文章:
http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html
http://www.cnblogs.com/mengdd/archive/2013/01/03/2843298.html
转载于:https://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html
观察者模式及Java实现例子相关推荐
- 观察者模式(java)浅析
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象.这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新. 观察者 ...
- jsch连接mysql_求用jsch网络工具包通过ssh连接远程oracle数据库并发送sql操作语句(数据库在unix上)java代码例子...
求用jsch网络工具包通过ssh连接远程oracle数据库(数据库在unix上)java代码例子:为何jsch发送:sqlplususer/pwd@service此命令,却没有结果返回啊.下面是代码: ...
- arcengine java_浅析 ArcEngine Java - EngineViewer 例子
例子源文件:\DeveloperKit\samples\Applications\EngineViewer\Java\EngineViewer.jar 运行环境的搭建: 解压后,在Eclipse或Jb ...
- 一个基于RSA算法的Java数字签名例子
====================================================== 注:本文源代码点此下载 ================================= ...
- 设计模式-观察者模式(Observer)-Java
设计模式-观察者模式(Observer)-Java 目录 文章目录 1.前言 2.示例案例-多人联机对战游戏的设计 3.观察者模式概述 3.1.观察者模式定义 3.2.观察者模式结构 3.3.观察者模 ...
- 观察者模式的Java实现及应用
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Turwe www.jianshu.com/p/1025f6 ...
- 设计模式之观察者模式(Java)
设计模式(Design pattern)是什么?它是一套由四人组(The Gang of Four, [1]的作者)总结出来的软件设计框架.其目的是为了提高代码的可重用性,增强系统的可维护性和代码的易 ...
- java代码例子_Java与C++两大语言比较
Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程 ...
- java 泛型例子_java中的泛型的一些常见例子
/** * @author Rollen-Holt 使用泛型 */ class hello { hello(){ } public T getName(){ return name; } public ...
最新文章
- python在线课程-《Python程序设计与应用》在线课程使用说明
- android accessibility 模拟键盘事件_H5 键盘兼容性小结
- DL之SSD:SSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- python前端学习-------Flask框架基础(建议收藏)
- 18行代码AC_排序 HDU - 1106(sstream简单解法)
- PHP学习笔记——Php文件引入
- 如何零基础入门FPGA?这篇文章让你吃透!
- JavaScript的NaN-唯一 一个自己不等于自己的对象!!
- nlp项目:搭建一个简单的问答系统
- mapreduce对日志数据上下行流量汇总
- struts1的actionform
- mysql实现翻页功能
- AMD重新进入核心竞争领域
- 如何把Windows10打造成Mac
- 【asm基础】nasm和masm的一些区别
- MySQL数据库知识点
- oracle七参数坐标转换,MapGIS国土空间数据2000大地坐标系转换系统
- 2021企业邮箱购买平台,2021常用电子邮箱有哪些?什么邮箱安全?
- 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态
- 从零开始学习Linux运维,成为IT领域翘楚(七)
热门文章
- 如何用Python一门语言通吃高性能并发、GPU计算和深度学习
- JavaCSV之写CSV文件
- [Hadoop] Hadoop学习历程 [持续更新中…]
- JQuery iframe 刷新效果
- Centos6.3下利用rsyslog+loganalyzer+mysql部署日志服务器
- ffmpeg-- audio decoder
- opencv利用直方图判断人脸光照质量
- 突出告警信息(DBA_OUTSTANDING_ALERTS)
- 数据库中char与varchar类型的区别
- Linux常用系统管理命令(top、free、kill、df)