设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(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);
}
}

输出结果:

设计模式之观察者模式(Observable与Observer)的更多相关文章
- java中观察者模式Observable和Observer
25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...
- 25、java中观察者模式Observable和Observer
如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房 ...
- 十一、观察者模式(Observable、Observer)
老板出差了,员工1.员工2..均放羊中.他们请求前台的秘书,当老板回来时通知自己,免得被Boss抓个现行.秘书想了想,说————嗯,这是观察者模式. 当一个对象的改变需要同时改变其它对象,而且它不知道 ...
- Java_观察者模式(Observable和Observer)
http://blog.csdn.net/tianjf0514/article/details/7475164/ 一.观察者模式介绍 在Java中通过Observable类和Observer接口实现了 ...
- Java_观察者模式(Observable和Observer) -转
原文地址: Java_观察者模式(Observable和Observer) 一.观察者模式介绍 在Java中通过Observable类和Observer接口实现了观察者模式.一个Observer ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- 23种设计模式之观察者模式(Observer)
观察者模式又称为发布—订阅模式.模型—视图模式.源-监听器模式或从属者(dependents)模式,是一种对象的行为型模式.它定义了对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相 ...
- 人人都会设计模式:观察者模式--Observer
https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都 ...
随机推荐
- 迷宫的最短路径 (BFS)
N*M的迷宫,从起点到终点,求最短距离 宽度优先搜索按照距开始状态由近及远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. (可以构造成pair或者编码成int来表达状态) ...
- 关于system()的一些用法
C语库函数 函数名: system 功 能: 发出一个DOS命令 用 法: int system(char *command); 它包含头文件<stdlib.h> system ...
- Fireasy
Fireasy与Asp.net MVC结合 Fireasy之前都是使用HttpService来为jquery ajax提供服务,这个HttpService实际上和MVC的原理机制是一样的,只是它支 ...
- Java
递归算法
其基本思路是递归算法设计:对于一个复杂的问题,原问题分为几个子问题相似相对简单.继续下去,直到孩子可以简单地解决问题,这是导出复发,因此,有复发的原始问题已经解决. 关键是要抓住: (1)递归出口 ( ...
- [Asp.net]站点地图SiteMap
原文:[Asp.net]站点地图SiteMap 引言 在项目中发现使用站点地图的控件,之前没总结过这方面的东西,就写了一个demo测试了一下,这里记录一下,算是总结吧. Web.sitemap < ...
- CSS3 制作向左、向右及关闭图标的效果 (另一种思路)
最终效果 制作步骤 1.边框 CSS及Html代码 显示效果 2.向左的标志 CSS及Html代码,增加的代码在黄色范围内 显示效果 方向不对了,马上修改一下方向,逆时针旋转45度调整一下 CSS及H ...
- MapReduce的InputFormat学习过程
昨天,经过几个小时的学习.该MapReduce学习的某一位的方法的第一阶段.即当大多数文件的开头的Data至key-value制图.那是,InputFormat的过程.虽说过程不是非常难,可是也存在非 ...
- ASP.NET学习笔记2--自己写代码绑定Gridview
像以前一样,先写好自己的样式布局, 第二步,在数据库建立一个商品表 代码如下: CREATE TABLE [SHANGPING_INFO] ( [Shangping_Id] INT PRIMARY K ...
- 手机web下拉加载
//需要 zepto.js支持 var page=0;//当前页 var pages=1;//总页数 var ajax=!1;//是否加载中 Zepto(function($){ $(window). ...
- Monkey源码分析之事件源
上一篇文章<Monkey源码分析之运行流程>给出了monkey运行的整个流程,让我们有一个概貌,那么往后的文章我们会尝试进一步的阐述相关的一些知识点. 这里先把整个monkey类的结构图给 ...