一、观察者模式概述

  观察者模式主要用于 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)的更多相关文章

  1. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  2. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  3. 【GOF23设计模式】观察者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 package com.test.observer; import ja ...

  4. 人人都会设计模式:观察者模式--Observer

    https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...

  5. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  6. [设计模式] 19 观察者模式 Observer Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...

  7. c#设计模式之观察者模式(Observer Pattern)

    场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...

  8. JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

  9. 设计模式之观察者模式(Observer pattern)

    最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下: 上课铃声响起,学生A/B/C/D进入教室:下课铃声响起,学生A/B/C/D离开教室. 要求使用设计模式的思想完成铃与学 ...

随机推荐

  1. C++复习3.C/C++常量的知识

    C/C++常量的知识 20130918 语言的实现隐含着使用着一些常量,如初始化全局变量静态变量,另外还有一些我们不曾感觉到的变量:函数地址(也就是函数名称), 静态数组的名字,字符串常亮的地址.常量 ...

  2. CF445

    题解: xjb乱判断一下就可以了 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; int n, ...

  3. RxJava 详解

    给 Android 开发者的 RxJava 详解: http://gank.io/post/560e15be2dca930e00da1083#toc_1

  4. shell脚本实例二

    练习题一:对已经存在的用户做密码的修改等操作 vim  user_ctrl.sh                 ##进行如下编写 #!/bin/bashShow(){        read -p ...

  5. linux下如何启动和关闭weblogic .

    在你定义的域中可以找到如下命令: /[youHome]/domains/[yourDomain]/startWebLogic.sh /[youHome]/domains/[yourDomain]/st ...

  6. Linux:tr命令详解

    tr tr命令可以对来自标准输入的字符进行替换.压缩和删除 语法 tr(选项)(SET1 SET2) 选项 -c或——complerment:取代所有不属于第一字符集的字符: -d或——delete: ...

  7. Android 贝塞尔曲线解析

    相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.利用"贝塞尔曲线"可以做出很多好看的UI效果,本篇博客就让我们一起学习"贝塞尔曲线 ...

  8. 自定义view:view的绘制流程

    1.view的绘制流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw. ...

  9. CS231n课程笔记翻译2:图像分类笔记

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记image classification notes,由课程教师Andrej Karpathy授权进行翻译.本篇教程由杜客翻译完成.Shiqin ...

  10. flash 一直在最上方,z-index无效

    设置embed的透明度 wmode="transparent" <embed src="http://player.youku.com/player.php/sid ...