观察者模式,也叫发布订阅模式,定义对象之间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

观察者模式的几个角色:

Subject被观察者:定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅是完成作为被观察者必须实现的职责。

Observer观察者:观察者收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。

ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义哪些事件进行通知。

ConcreteObserver具体的观察者:每个观察者在接受到消息后的处理反应是不同,各个观察者有自己的处理逻辑。

1. 代码

// 被观察者
public abstract class Subject {// 定一个一个观察者数组 ArrayList是线程异步,不安全,Vector是线程同步,安全private Vector<Observer> obsVector = new Vector<Observer>();// 增加一个观察者public void addObserver(Observer o) {this.obsVector.add(o);}// 删除一个观察者public void delObserver(Observer o) {this.obsVector.remove(o);}// 通知所有观察者public void notifyObserver() {for (Observer o : this.obsVector) {o.update();}}
}// 具体的被观察者
public class ConcreteSubject extends Subject {// 具体的业务public void doSomething() {/** do something*/super.notifyObserver();}
}// 观察者
public interface Observer {// 更新方法public void update();
}// 具体观察者
public class ConcreteObserver implements Observer {// 实现更新方法public void update() {System.out.println("接收到信息,并进行处理!");}}// 场景类
public class Client {public static void main(String[] args) {// 创建一个被观察者ConcreteSubject subject = new ConcreteSubject();// 定义一个观察则Observer obs = new ConcreteObserver();// 观察者观察被被观察则subject.addObserver(obs);// 观察者开始活动了subject.doSomething();}}

2. 使用java.util包中的标准类实现观察者模式

JDK提供了对观察者模式的支持接口和实现类。

其中接口 java.util.Observer 用来指定观察者,观察者必须实现 void update(Observable o, Object arg) 方法,参数 Observable o 用于指定触发 update 方法的对象, Object arg 用于指定触发 update 方法时候的附加参数。而 java.util.Observable 用来指定观察物(被观察者、可被观察的),并且提供了一系列的方法。

import java.util.Observable;
import java.util.Observer;/*** 使用java.util包中的标准类实现观察者模式*/
public class ObserverClient {public static void main(String[] args) {ObserverClient client = new ObserverClient();// 被观察者ConcreteSubject1 subject1 = client.new ConcreteSubject1(1);ConcreteSubject2 subject2 = client.new ConcreteSubject2("userek");// 观察者Observer observer1 = client.new ConcreteObserver1();Observer observer2 = client.new ConcreteObserver2();// 注册subject1.addObserver(observer1);subject1.addObserver(observer2);subject2.addObserver(observer1);// 改变被观察者状态,触发观察者回调函数subject1.doSomething();subject2.doSomething();}class ConcreteSubject1 extends Observable {private int mSubjectValue;private ConcreteSubject1(int mSubjectValue) {super();this.mSubjectValue = mSubjectValue;}public void doSomething() {setChanged();notifyObservers(mSubjectValue);}@Overridepublic String toString() {return getClass().getSimpleName();}}class ConcreteSubject2 extends Observable {private String mSubjectName;private ConcreteSubject2(String mSubjectName) {super();this.mSubjectName = mSubjectName;}public void doSomething() {setChanged();notifyObservers(mSubjectName);}@Overridepublic String toString() {return getClass().getSimpleName();}}class ConcreteObserver1 implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("第一个 Observer!" + " 被观察者 : " + o + ", 观察的值为" + (arg instanceof Integer ? "整型" : "字符串") + ": " + arg);}}class ConcreteObserver2 implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("第二个 Observer!");}}}

Java设计模式笔记(6)观察者模式相关推荐

  1. Java设计模式笔记——七个结构型模式

    系列文章目录 第一章 Java设计模式笔记--七大设计原则 第二章 Java设计模式笔记--六个创建型模式 文章目录 系列文章目录 一.适配器模式 1.概念 2.类适配器 3.对象适配 4.缺省适配器 ...

  2. Java 设计模式之《观察者模式》

    很久之前,自己也曾看过一些设计模式的内容,最近在做一些程序代码设计的时,发现忘得差不多了,很多模式也只是有大致影响,决定重新将一些常用的模式复习一下.今天一个模式观察者模式. 观察者模式 观察者模式属 ...

  3. Java设计模式10:观察者模式

    观察者模式 观察者模式也叫作发布-订阅模式,也就是事件监听机制.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他 ...

  4. java 观察者模式_重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」...

    一.前言 知道的越多不知道的就越多 编程开发这条路上的知识是无穷无尽的,就像以前你敢说精通Java,到后来学到越来越多只想写了解Java,过了几年现在可能想说懂一点点Java.当视野和格局的扩大,会让 ...

  5. 关于java设计模式笔记

    学习自http://blog.csdn.net/zhangerqing/article/details/8194653/ 创建型模式: 普通工厂模式:建立工厂类,根据传入的字符串 对实现了同一个接口的 ...

  6. Java设计模式19:观察者模式(Observer)

    观察者模式 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新 适用性 1.当一个抽象模型有两个方面,其中一个依赖另外一个 2.当对一个对象的 ...

  7. Java 设计模式情景分析——观察者模式

    观察者模式是一种使用频率非常高的模式,有时也被称作发布/订阅模式,属于行为型模式,它最常用的是 GUI 系统.发布/订阅系统,它一个重要作用就是解耦,使得它们之间的依赖性更小.观察者模式定义了对象间一 ...

  8. 设计模式笔记(19)---观察者模式(行为型)

    Gof定义 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通 知并自动更新 动机 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系&qu ...

  9. Java设计模式笔记(5)建造者模式

    建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式的4个角色: Product产品类:通常是实现了模版方法模式,有模版方法和基本方法. Builder抽 ...

最新文章

  1. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间
  2. Docker Hello World容器运行报错的解决办法
  3. php 递归到空如何处理,php递归调用删除数组空值元素的方法
  4. HTML列表内容自动排序,JS实现HTML表格排序功能
  5. 经典功率谱估计及Matlab仿真
  6. linus开启snmp_【snmp】Linux开启snmp及查询
  7. JavaScript 虚拟键盘 A-Keyboard
  8. SecureCRT的logon action登录跳转设置
  9. SharePoint 使用ECMAscript对象模型来读取帖子列表
  10. html5 jquery音乐播放器,play()和pause()不起作用
  11. Excel如何删除表格中的空白列
  12. dos下拷贝服务器文件命令行,win7在DOS环境下怎么使用copy命令?使用copy命令复制文件的方法...
  13. MOS管当开关控制时,为什么一般用PMOS做上管NMOS做下管?
  14. discuz 如何去掉:导读-最新发表
  15. DP DD VTL 备份 NBU
  16. R语言箱线图添加显著性--不同水平实现方法
  17. 学习笔记-局域网和城域网(二)
  18. linux freemodbus tcp,FreeModbus LINUXTCP Compile ERROR
  19. 小米保存的html在哪,小米手机用快传接收的文件储存在什么地方?
  20. MRP与SQL之一:库存表的设计和SQL查询

热门文章

  1. js 静止f1到f12 和屏蔽鼠标右键
  2. npm install引起的项目崩溃(This is probably not a problem with npm,there is likely additional logging outp)
  3. 怎样在php中使用PDF文档功能
  4. No field gDefault in class Landroid/app/ActivityManagerNative
  5. mongoose 分页查询
  6. C++如何产生随机数
  7. Android 应用更新和在服务器下载android应用
  8. 1018 锤子剪刀布 (20分)
  9. owncloud nginx php,nginx配置owncloud记录。
  10. not enough arguments for format string