一、观察者模式概述

  观察者模式主要用于 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. Mit-Scheme 安装小记

    Win10 到 http://www.gnu.org/software/mit-scheme/ 下载对应平台的安装包,我下载的是windows 版本 安装到本地后只出现一个快捷方式MIT-GNU Sc ...

  2. JTable的应用

    最近项目中使用到一个table表格,表格的样子如下: 可以修改数量,以及折扣,对应的最终价会相应的变化. 随手写了份插件,命名为JTable,可以给热爱jquery 的友友们一个参考: 代码如下: / ...

  3. 说说C++多重继承

    尽管大多数应用程序都使用单个基类的公用继承,但有些时候单继承是不够用的,因为可能无法为问题域建模或对模型带来不必要的复杂性.在这种情况下,多重继承可以更直接地为应用程序建模. 一.基本概念 多重继承是 ...

  4. 第5课:内置函数、处理json、常用模块

    1. 内置函数 1)常用的内置函数 print(all([0, 2, 3, 4])) # False,判断可迭代的对象里面的值是否都为真 print(any([0, 1, 2, 3, 4])) # T ...

  5. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

  6. 一条命令修改Linux密码

    方法一.直接使用passwd命令 /bin/echo newpass|/usr/bin/passwd --stdin username *注:该方式只适用于红帽系操作系统,比如centos,redha ...

  7. vue.js 源代码学习笔记 ----- observe

    参考 vue 2.2.6版本 /* @flow */ //引入订阅者模式 import Dep from './dep' import { arrayMethods } from './array' ...

  8. IR Cut Filter

    IR cut filter,即红外截止滤光片,它放在于LENS与Sensor之间.因人眼与CMOS Sensor对各波长的响应不同,人眼看不到红外光但sensor会感应,因此需要IR cut filt ...

  9. [置顶] Isolation Forest算法原理详解

    本文只介绍原论文中的 Isolation Forest 孤立点检测算法的原理,实际的代码实现详解请参照我的另一篇博客:Isolation Forest算法实现详解. 或者读者可以到我的GitHub上去 ...

  10. iOS NSString相关问题

    1.NSString对象的创建 // 1.创建不可变字符串 NSString *str1 = @"create string"; #pragma mark 对象方法创建字符串 // ...