GOF23设计模式之观察者模式(observer)
一、观察者模式概述
观察者模式主要用于 1 :N 的通知。当一个对象(目标对象 Subject 或 Observable)的状态变化时,它需要通知一系列对象(观察者对象 Observer),令它们做出响应。
通知观察者的方式:
(1)推
每次都会把通知以广播的方式发送给所有观察者,所有观察者只能被动接收。
(2)拉
观察者只要知道有情况即可。至于什么时候获取内容,获取哪些内容,都可以自主决定。
二、观察者模式示例代码
/**
* 观察者对象接口
* @author CL
*
*/
public interface Observer {
/**
* 更新主题
* @param subject
*/
void update(Subject subject); }
/**
* 主题对象(目标对象)
* @author CL
*
*/
public class Subject { protected List<Observer> list; public Subject() {
list = new ArrayList<Observer>();
} public void addObserver(Observer observer) {
list.add(observer);
} public void removeObserver(Observer observer) {
list.remove(observer);
} /**
* 通知所以观察者更新状态
*/
public void notifyAllObserver() {
for (Observer o : list) {
o.update(this);
}
} }
/**
* 具体的目标对象
* @author CL
*
*/
public class ConcreteSubject extends Subject { /**
* 状态
*/
private int state; public int getState() {
return state;
} public void setState(int state) {
this.state = state;
//若主题对象(目标对象)发生的状态发生改变,请通知所有观察者更新状态
this.notifyAllObserver();
} }
/**
* 观察者
* @author CL
*
*/
public class ObserverA implements Observer { private int myState; //myState需要和目标对象的state保持一致 @Override
public void update(Subject subject) {
myState = ((ConcreteSubject) subject).getState();
} public int getMyState() {
return myState;
} public void setMyState(int myState) {
this.myState = myState;
} }
测试:
/**
* 测试观察者模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
//目标对象
ConcreteSubject sub = new ConcreteSubject(); //创建三个观察者
ObserverA o1 = new ObserverA();
ObserverA o2 = new ObserverA();
ObserverA o3 = new ObserverA(); //将这三个观察者添加到目标对象subject的容器中
sub.addObserver(o1);
sub.addObserver(o2);
sub.addObserver(o3); //修改目标对象的状态值
sub.setState(100); System.out.println(o1.getMyState());
System.out.println(o2.getMyState());
System.out.println(o3.getMyState()); System.out.println("----------------------"); //修改目标对象的状态值
sub.setState(10); System.out.println(o1.getMyState());
System.out.println(o2.getMyState());
System.out.println(o3.getMyState());
}
}
控制台输出:
100
100
100
----------------------
10
10
10
三、JDK 中提供类和方法实现观察者模式
import java.util.Observable; /**
* 目标对象
* @author CL
*
*/
public class ConcreteSubject extends Observable {
private int state; public int getState() {
return state;
} public void setState(int state) {
this.state = state; setChanged(); //表示目标对象已经更改状态 notifyObservers(); //通知所有观察者
} }
import java.util.Observable;
import java.util.Observer; /**
* 观察者对象
* @author CL
*
*/
public class ObserverA implements Observer { private int myState; @Override
public void update(Observable o, Object arg) {
myState = ((ConcreteSubject) o).getState();
} public int getMyState() {
return myState;
} public void setMyState(int myState) {
this.myState = myState;
} }
测试:
/**
* 测试利用java.util.*包中的类Observable和接口Obsever实现的观察者模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
//目标对象
ConcreteSubject sub = new ConcreteSubject(); //创建三个观察者
ObserverA o1 = new ObserverA();
ObserverA o2 = new ObserverA();
ObserverA o3 = new ObserverA(); //将这三个观察者添加到目标对象subject的容器中
sub.addObserver(o1);
sub.addObserver(o2);
sub.addObserver(o3); //修改目标对象的状态值
sub.setState(666); System.out.println(o1.getMyState());
System.out.println(o2.getMyState());
System.out.println(o3.getMyState()); System.out.println("----------------------"); //修改目标对象的状态值
sub.setState(123); System.out.println(o1.getMyState());
System.out.println(o2.getMyState());
System.out.println(o3.getMyState());
}
}
控制台输出:
666
666
666
----------------------
123
123
123
四、观察者模式常见开发应用场景
(1)手机APP中每天的推送广告;
(2)多人联机网络游戏中,服务器实时分发所有玩家的状态;
(3)Servlet 中监听器的实现;
(4)Android 中广播机制;
(5)JDK 的 AWT 事件处理模型,基于观察者模式的委派事件模型(Delegation Event Model)
事件源:目标对象
事件监听器:观察者
(6)…………
GOF23设计模式之观察者模式(observer)的更多相关文章
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- 【GOF23设计模式】观察者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 package com.test.observer; import ja ...
- 人人都会设计模式:观察者模式--Observer
https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...
- 二十四种设计模式:观察者模式(Observer Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- [设计模式] 19 观察者模式 Observer Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...
- c#设计模式之观察者模式(Observer Pattern)
场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...
- JAVA设计模式之观察者模式 - Observer
有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...
- 设计模式之观察者模式(Observer pattern)
最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下: 上课铃声响起,学生A/B/C/D进入教室:下课铃声响起,学生A/B/C/D离开教室. 要求使用设计模式的思想完成铃与学 ...
随机推荐
- Django知识点总结
一.什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. web应 ...
- Netlink 基础知识
Netlink 基础知识 Netlink 相对于系统调用,ioctl 以及 /proc 文件系统而言具有以下优点: 1. 用户仅需要在 include/linux/netlink.h 中增加一个新类型 ...
- 【LeetCode 231_整数_位运算】Power of Two
bool isPowerOfTwo(int n) { && !(n & (n - )); }
- Systems
package com.System; public class Study01 { /* * System 包含一些游泳的类字段和方法 * 继承自java.lang包 * JDK1.0开始 * 全部 ...
- EFM32 ARM+ KEIl program
1Hardware connection When using the EFM32 starter kit to make a JLINK burn, you must connect the con ...
- MySQL 不开启slave如何完成异地复制
1,分批次通过远程的binlog来进行数据加载 业务新需求,线上数据库数据拉到本次,但是不允许开启slave服务,不建立直接外网的数据库账号,也不能打通数据库对外网的网络,所以我们测试环境无法通过普通 ...
- React-Native基础_4.View组件
View组件 对应ios 的UIView android 中的view 使用要先导入View import { View } from 'react-native'; 使用就是View标签,可以添加S ...
- HAWQ中的行列转置
行列转置是ETL或报表系统中的常见需求,HAWQ提供的内建函数和过程语言编程功能,使行列转置操作的实现变得更为简单. 一.行转列 1. 固定列数的行转列 原始数据如下: test=# select * ...
- 实现同时提交多个form(基础方法) 收集(转)
方法一: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4 ...
- BZOJ2824 AHOI2012 铁盘整理 【IDA*】
BZOJ2824 AHOI2012 铁盘整理 Description 在训练中,一些臂力训练器材是少不了的,小龙在练习的时候发现举重器械上的铁盘放置的非常混乱,并没有按照从轻到重的顺序摆放,这样非常不 ...