设计模式之观察者模式(Observable与Observer)

好久没有写博客啦,之前看完了《设计模式之禅》也没有总结一下,现在回忆一下设计模式之观察者模式。

1.什么是观察者模式

  简单情形:有A、B、C、D等四个独立的对象,其中B、C、D这三个对象想在A对象发生改变的第一时间知道这种改变,以便做出相应的响应或者对策。

  上面的这种情形,就是观察者模式。

  当然可以有多个观察者多个被观察者

  观察者与被观察者也不是对立的,一个对象可以观察其他对象,也可以被其他对象观察。

2.观察者模式的应用

  为了更好的理解什么是观察者模式,下面我举一些可能用到该模式的情形或例子:

  (1)周期性任务。比如linux中的周期性任务命令crontab命令,win7下的定时关机命令shutdown -s -t 1200(1200s后关机)。这些命令当预期系统时间到后,就可以通知相应的观察者激活相应的命令。

  (2)重新加载配置文件。现在做大型系统基本都会有配置文件,例如在SSH项目中每次修改配置文件后,都需要重新启动服务器才能使得新的配置文件生效(当然SSH中貌似已经提供了参数设置,当配置文件修改时,可以自动重新加载)。

3.观察者模式需要用到的Java类

  3.1 java.util.Observable

    -able一般可能...的单词后缀,Observable就是可以被观察的,程序中的被观察者类,需要继承这个类。

  3.2 java.util.Observer

    这个是观察者,是接口。程序中的观察者类,需要实现这个接口中的update()方法。

4.程序实例+注释说明

  4.1 身份单一的观察者(被观察者)

  4.1.1被观察者类

import java.util.Observable;
//被观察者类
public class NumObservable extends Observable {
int data = 0; public void setData(int i) {
data = i;
setChanged(); //标记此 Observable对象为已改变的对象
notifyObservers(); //通知所有观察者
}
}

  4.1.2观察者类

import java.util.Observable;
import java.util.Observer;
//观察者类
public class NumObserver implements Observer{ public void update(Observable o, Object arg) { //有被观察者发生变化,自动调用对应观察者的update方法
NumObservable myObserable=(NumObservable) o; //获取被观察者对象
System.out.println("Data has changed to " +myObserable.data);
}
}

  4.1.3 Test测试类

public class Test {
public static void main(String[] args) {
NumObservable number = new NumObservable(); //被观察者对象
number.addObserver(new NumObserver()); //给number这个被观察者添加观察者(当然可以有多个观察者)
number.setData(1);
number.setData(2);
number.setData(3);
}
}

  测试输出:

  

  4.2 既是观察者又是被观察者

  4.2.1 MultA类

import java.util.Observable;
import java.util.Observer; public class MultA extends Observable implements Observer{
public void update(Observable o, Object arg) { //有被观察者发生变化,自动调用相应观察者的update方法
MultB multb=(MultB) o; //获取被观察者对象
System.out.println("MultA监听到MultB数据变化:" +multb.data); setChanged();
notifyObservers(); //自己观察到数据变化,通知自己的观察者
}
}

  4.2.2 MultB类

import java.util.Observable;
import java.util.Observer;
public class MultB extends Observable implements Observer {
int data = 0; public void setData(int i) {
data = i;
setChanged(); //标记此 Observable对象为已改变的对象
notifyObservers(); //通知所有观察者
} public void update(Observable arg0, Object arg1) {
System.out.println("MultB观察到几乎同时MultA也有数据变化,貌似自己的变化被监听。。。。");
}
}

  4.2.3 Test测试类

public class Test {
public static void main(String[] args) {
MultA multa = new MultA();
MultB multb = new MultB(); multb.addObserver(multa);
multa.addObserver(multb); multb.setData(1);
}
}

  输出结果:

    

 
 
分类: java编程

设计模式之观察者模式(Observable与Observer)的更多相关文章

  1. java中观察者模式Observable和Observer

    25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...

  2. 25、java中观察者模式Observable和Observer

    如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房 ...

  3. 十一、观察者模式(Observable、Observer)

    老板出差了,员工1.员工2..均放羊中.他们请求前台的秘书,当老板回来时通知自己,免得被Boss抓个现行.秘书想了想,说————嗯,这是观察者模式. 当一个对象的改变需要同时改变其它对象,而且它不知道 ...

  4. Java_观察者模式(Observable和Observer)

    http://blog.csdn.net/tianjf0514/article/details/7475164/ 一.观察者模式介绍 在Java中通过Observable类和Observer接口实现了 ...

  5. Java_观察者模式(Observable和Observer) -转

    原文地址: Java_观察者模式(Observable和Observer) 一.观察者模式介绍    在Java中通过Observable类和Observer接口实现了观察者模式.一个Observer ...

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

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

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

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

  8. 23种设计模式之观察者模式(Observer)

    观察者模式又称为发布—订阅模式.模型—视图模式.源-监听器模式或从属者(dependents)模式,是一种对象的行为型模式.它定义了对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相 ...

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

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

随机推荐

  1. 迷宫的最短路径 (BFS)

    N*M的迷宫,从起点到终点,求最短距离 宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案.  (可以构造成pair或者编码成int来表达状态) ...

  2. 关于system()的一些用法

    C语库函数 函数名: system  功  能: 发出一个DOS命令  用  法: int system(char *command);  它包含头文件<stdlib.h>  system ...

  3. Fireasy

    Fireasy与Asp.net MVC结合   Fireasy之前都是使用HttpService来为jquery ajax提供服务,这个HttpService实际上和MVC的原理机制是一样的,只是它支 ...

  4. Java 递归算法

    其基本思路是递归算法设计:对于一个复杂的问题,原问题分为几个子问题相似相对简单.继续下去,直到孩子可以简单地解决问题,这是导出复发,因此,有复发的原始问题已经解决. 关键是要抓住: (1)递归出口 ( ...

  5. [Asp.net]站点地图SiteMap

    原文:[Asp.net]站点地图SiteMap 引言 在项目中发现使用站点地图的控件,之前没总结过这方面的东西,就写了一个demo测试了一下,这里记录一下,算是总结吧. Web.sitemap < ...

  6. CSS3 制作向左、向右及关闭图标的效果 (另一种思路)

    最终效果 制作步骤 1.边框 CSS及Html代码 显示效果 2.向左的标志 CSS及Html代码,增加的代码在黄色范围内 显示效果 方向不对了,马上修改一下方向,逆时针旋转45度调整一下 CSS及H ...

  7. MapReduce的InputFormat学习过程

    昨天,经过几个小时的学习.该MapReduce学习的某一位的方法的第一阶段.即当大多数文件的开头的Data至key-value制图.那是,InputFormat的过程.虽说过程不是非常难,可是也存在非 ...

  8. ASP.NET学习笔记2--自己写代码绑定Gridview

    像以前一样,先写好自己的样式布局, 第二步,在数据库建立一个商品表 代码如下: CREATE TABLE [SHANGPING_INFO] ( [Shangping_Id] INT PRIMARY K ...

  9. 手机web下拉加载

    //需要 zepto.js支持 var page=0;//当前页 var pages=1;//总页数 var ajax=!1;//是否加载中 Zepto(function($){ $(window). ...

  10. Monkey源码分析之事件源

    上一篇文章<Monkey源码分析之运行流程>给出了monkey运行的整个流程,让我们有一个概貌,那么往后的文章我们会尝试进一步的阐述相关的一些知识点. 这里先把整个monkey类的结构图给 ...