Java设计模式笔记(6)观察者模式
观察者模式,也叫发布订阅模式,定义对象之间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
观察者模式的几个角色:
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)观察者模式相关推荐
- Java设计模式笔记——七个结构型模式
系列文章目录 第一章 Java设计模式笔记--七大设计原则 第二章 Java设计模式笔记--六个创建型模式 文章目录 系列文章目录 一.适配器模式 1.概念 2.类适配器 3.对象适配 4.缺省适配器 ...
- Java 设计模式之《观察者模式》
很久之前,自己也曾看过一些设计模式的内容,最近在做一些程序代码设计的时,发现忘得差不多了,很多模式也只是有大致影响,决定重新将一些常用的模式复习一下.今天一个模式观察者模式. 观察者模式 观察者模式属 ...
- Java设计模式10:观察者模式
观察者模式 观察者模式也叫作发布-订阅模式,也就是事件监听机制.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他 ...
- java 观察者模式_重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」...
一.前言 知道的越多不知道的就越多 编程开发这条路上的知识是无穷无尽的,就像以前你敢说精通Java,到后来学到越来越多只想写了解Java,过了几年现在可能想说懂一点点Java.当视野和格局的扩大,会让 ...
- 关于java设计模式笔记
学习自http://blog.csdn.net/zhangerqing/article/details/8194653/ 创建型模式: 普通工厂模式:建立工厂类,根据传入的字符串 对实现了同一个接口的 ...
- Java设计模式19:观察者模式(Observer)
观察者模式 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新 适用性 1.当一个抽象模型有两个方面,其中一个依赖另外一个 2.当对一个对象的 ...
- Java 设计模式情景分析——观察者模式
观察者模式是一种使用频率非常高的模式,有时也被称作发布/订阅模式,属于行为型模式,它最常用的是 GUI 系统.发布/订阅系统,它一个重要作用就是解耦,使得它们之间的依赖性更小.观察者模式定义了对象间一 ...
- 设计模式笔记(19)---观察者模式(行为型)
Gof定义 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通 知并自动更新 动机 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系&qu ...
- Java设计模式笔记(5)建造者模式
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式的4个角色: Product产品类:通常是实现了模版方法模式,有模版方法和基本方法. Builder抽 ...
最新文章
- leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间
- Docker Hello World容器运行报错的解决办法
- php 递归到空如何处理,php递归调用删除数组空值元素的方法
- HTML列表内容自动排序,JS实现HTML表格排序功能
- 经典功率谱估计及Matlab仿真
- linus开启snmp_【snmp】Linux开启snmp及查询
- JavaScript 虚拟键盘 A-Keyboard
- SecureCRT的logon action登录跳转设置
- SharePoint 使用ECMAscript对象模型来读取帖子列表
- html5 jquery音乐播放器,play()和pause()不起作用
- Excel如何删除表格中的空白列
- dos下拷贝服务器文件命令行,win7在DOS环境下怎么使用copy命令?使用copy命令复制文件的方法...
- MOS管当开关控制时,为什么一般用PMOS做上管NMOS做下管?
- discuz 如何去掉:导读-最新发表
- DP DD VTL 备份 NBU
- R语言箱线图添加显著性--不同水平实现方法
- 学习笔记-局域网和城域网(二)
- linux freemodbus tcp,FreeModbus LINUXTCP Compile ERROR
- 小米保存的html在哪,小米手机用快传接收的文件储存在什么地方?
- MRP与SQL之一:库存表的设计和SQL查询
热门文章
- js 静止f1到f12 和屏蔽鼠标右键
- npm install引起的项目崩溃(This is probably not a problem with npm,there is likely additional logging outp)
- 怎样在php中使用PDF文档功能
- No field gDefault in class Landroid/app/ActivityManagerNative
- mongoose 分页查询
- C++如何产生随机数
- Android 应用更新和在服务器下载android应用
- 1018 锤子剪刀布 (20分)
- owncloud nginx php,nginx配置owncloud记录。
- not enough arguments for format string